2013年8月7日 星期三

OpenWrt telnet

要能 telnet,telnetd 需要執行。我想設計的理念是剛安裝完,root 沒密碼,此時便執行 telnetd,所以 telnetd 在特定條件下才會執行。

/etc/init.d/telnet:

#!/bin/sh /etc/rc.common
# Copyright (C) 2006-2011 OpenWrt.org

START=50

has_root_pwd() {
 local pwd=$([ -f "$1" ] && cat "$1")
       pwd="${pwd#*root:}"
       pwd="${pwd%%:*}"

 test -n "${pwd#[\!x]}"
}

get_root_home() {
 local homedir=$([ -f "$1" ] && cat "$1")
 homedir="${homedir#*:*:0:0:*:}"

 echo "${homedir%%:*}"
}

has_ssh_pubkey() {
 ( /etc/init.d/dropbear enabled 2> /dev/null && grep -qs "^ssh-" /etc/dropbear/authorized_keys ) || \
 ( /etc/init.d/sshd enabled 2> /dev/null && grep -qs "^ssh-" "$(get_root_home /etc/passwd)"/.ssh/authorized_keys )
}

start() {
 if ( ! has_ssh_pubkey && \
      ! has_root_pwd /etc/passwd && ! has_root_pwd /etc/shadow ) || \
    ( ! /etc/init.d/dropbear enabled 2> /dev/null && ! /etc/init.d/sshd enabled 2> /dev/null );
 then
  service_start /usr/sbin/telnetd -l /bin/login.sh
 fi
}

stop() {
 service_stop /usr/sbin/telnetd
}

包括:
  1. 沒有 ssh pubkey 且
  2. 沒有 root password 且
  3. ssh server (dropbear 或 sshd) 未啟用 (註:)
註:未啟用 (not enabled) 未必未執行 (not started),有無啟用是檢查對應的 /etc/rc.d/Sxxx 是否存在

再來,telnet 進來的 login script 是 /bin/login.sh

#!/bin/sh
# Copyright (C) 2006-2011 OpenWrt.org

if ( ! grep -qs '^root:[!x]\?:' /etc/shadow || \
     ! grep -qs '^root:[!x]\?:' /etc/passwd ) && \
   [ -z "$FAILSAFE" ]
then
 echo "Login failed."
 exit 0
else
cat << EOF
 === IMPORTANT ============================
  Use 'passwd' to set your login password
  this will disable telnet and enable SSH
 ------------------------------------------
EOF
fi

exec /bin/ash --login
會再檢查一次 root passwd (但方式不同)

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...