返回列表 发布新帖
查看: 493|回复: 2

TP-LINK新固件SSH密码几乎无解

发表于 2025-2-19 02:36:04 | 查看全部 |阅读模式

立刻注册账号,享受更清爽的界面!

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 Luochancy 于 2025-2-19 02:39 编辑

洛手头上有一台R473G V3,想折腾一下
查了下N3发现SSH密码通过MAC就可以算
然后算半天密码不对
然后就想着去解更新包看看
一看不知道,TP-LINK更新了SSH密码计算方式



固件来源:TP-LINK
解包工具:https://zhiwanyuzhou.com/
文件位置:/etc/init.d/dropbear



这是原来的:
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2006-2010 OpenWrt.org
  3. # Copyright (C) 2006 Carlos Sobrinho

  4. START=50
  5. STOP=50

  6. SERVICE_USE_PID=1

  7. NAME=dropbear
  8. PROG=/usr/sbin/dropbear
  9. PIDCOUNT=0
  10. EXTRA_COMMANDS="killclients"
  11. EXTRA_HELP="        killclients Kill ${NAME} processes except servers and yourself"

  12. getNewPasswd()
  13. {
  14.         . /lib/functions.sh
  15.         local macAddr=""
  16.         macAddr=$(ubus call tddpServer getInfo '{"infoMask":1,"sep":"-"}' | sed 's/-//g' | jsonfilter -e '@.mac')
  17.         echo "macAddr from tddp config is $macAddr" > /dev/console

  18.         local key=$(echo -n "$macAddr" | md5sum)
  19.         key=$(echo ${key:0:16})
  20.         #echo "key is $key" > /dev/console

  21.         echo ${key}
  22. }

  23. setNewPasswd()
  24. {
  25.         local newPasswd=`getNewPasswd`
  26.         #echo "newPasswd is $newPasswd" > /dev/console
  27.         (echo "$newPasswd";sleep 1;echo "$newPasswd") | passwd > /dev/null
  28. }

  29. setDefaultPasswd()
  30. {
  31.         cp /rom/etc/passwd /etc/passwd &> /dev/null
  32. }

  33. dropbear_start()
  34. {
  35.         append_ports()
  36.         {
  37.                 local ifname="$1"
  38.                 local port="$2"

  39.                 grep -qs "^ *$ifname:" /proc/net/dev || {
  40.                         append args "-p $port"
  41.                         return
  42.                 }

  43.                 for addr in $(
  44.                         ifconfig "$ifname" | sed -ne '
  45.                                 /addr: *fe[89ab][0-9a-f]:/d
  46.                                 s/.* addr: *\([0-9a-f:\.]*\).*/\1/p
  47.                         '
  48.                 ); do
  49.                         append args "-p $addr:$port"
  50.                 done
  51.         }


  52.         local section="$1"

  53.         # Customized kill switch
  54.         config_get_bool ssh_port_switch "${section}" ssh_port_switch 0
  55.         echo "ssh_port_switch is $ssh_port_switch" > /dev/console
  56.         if [ "$ssh_port_switch" != "1" ]; then
  57.                 echo "set default passwd" > /dev/console
  58.                 setDefaultPasswd
  59.                 return 0
  60.         fi

  61.         # check if section is enabled (default)
  62.         local enabled
  63.         config_get_bool enabled "${section}" enable 1
  64.         [ "${enabled}" -eq 0 ] && return 1

  65.         setNewPasswd

  66.         # verbose parameter
  67.         local verbosed
  68.         config_get_bool verbosed "${section}" verbose 0

  69.         # increase pid file count to handle multiple instances correctly
  70.         PIDCOUNT="$(( ${PIDCOUNT} + 1))"

  71.         # prepare parameters (initialise with pid file)
  72.         local pid_file="/var/run/${NAME}.${PIDCOUNT}.pid"
  73.         local args="-P $pid_file"
  74.         local val
  75.         # A) password authentication
  76.         config_get_bool val "${section}" PasswordAuth 1
  77.         [ "${val}" -eq 0 ] && append args "-s"
  78.         # B) listen interface and port
  79.         local port
  80.         local interface
  81.         config_get interface "${section}" Interface
  82.         config_get interface "${interface}" ifname "$interface"
  83.         config_get port "${section}" Port 22
  84.         append_ports "$interface" "$port"
  85.         # C) banner file
  86.         config_get val "${section}" BannerFile
  87.         [ -f "${val}" ] && append args "-b ${val}"
  88.         # D) gatewayports
  89.         config_get_bool val "${section}" GatewayPorts 0
  90.         [ "${val}" -eq 1 ] && append args "-a"
  91.         # E) root password authentication
  92.         config_get_bool val "${section}" RootPasswordAuth 1
  93.         [ "${val}" -eq 0 ] && append args "-g"
  94.         # F) root login
  95.         config_get_bool val "${section}" RootLogin 1
  96.         [ "${val}" -eq 0 ] && append args "-w"
  97.         # G) host keys
  98.         config_get val "${section}" rsakeyfile
  99.         [ -f "${val}" ] && append args "-r ${val}"
  100.         config_get val "${section}" dsskeyfile
  101.         [ -f "${val}" ] && append args "-d ${val}"

  102.         # execute program and return its exit code
  103.         [ "${verbosed}" -ne 0 ] && echo "${initscript}: section ${section} starting ${PROG} ${args}"
  104.         SERVICE_PID_FILE="$pid_file" service_start ${PROG} ${args}
  105. }

  106. keygen()
  107. {
  108.         for keytype in rsa dss; do
  109.                 # check for keys
  110.                 key=dropbear/dropbear_${keytype}_host_key
  111.                 [ -f /tmp/$key -o -s /etc/$key ] || {
  112.                         # generate missing keys
  113.                         mkdir -p /tmp/dropbear
  114.                         [ -x /usr/bin/dropbearkey ] && {
  115.                                 /usr/bin/dropbearkey -t $keytype -f /tmp/$key 2>&- >&- && exec /etc/rc.common "$initscript" start
  116.                         } &
  117.                 exit 0
  118.                 }
  119.         done

  120.         lock /tmp/.switch2jffs
  121.         mkdir -p /etc/dropbear
  122.         mv /tmp/dropbear/dropbear_* /etc/dropbear/
  123.         lock -u /tmp/.switch2jffs
  124.         chown root /etc/dropbear
  125.         chmod 0700 /etc/dropbear
  126. }

  127. start()
  128. {
  129.         [ -s /etc/dropbear/dropbear_rsa_host_key -a \
  130.           -s /etc/dropbear/dropbear_dss_host_key ] || keygen

  131.         config_load "${NAME}"
  132.         config_foreach dropbear_start dropbear
  133. }

  134. stop()
  135. {
  136.         local pid_file pid_files
  137.        
  138.         pid_files=`ls /var/run/${NAME}.*.pid 2>/dev/null`
  139.        
  140.         [ -z "$pid_files" ] && return 1
  141.        
  142.         for pid_file in $pid_files; do
  143.                 SERVICE_PID_FILE="$pid_file" service_stop ${PROG} && {
  144.                         rm -f ${pid_file}
  145.                 }
  146.         done
  147. }

  148. killclients()
  149. {
  150.         local ignore=''
  151.         local server
  152.         local pid

  153.         # if this script is run from inside a client session, then ignore that session
  154.         pid="$$"
  155.         while [ "${pid}" -ne 0 ]
  156.          do
  157.                 # get parent process id
  158.                 pid=`cut -d ' ' -f 4 "/proc/${pid}/stat"`
  159.                 [ "${pid}" -eq 0 ] && break

  160.                 # check if client connection
  161.                 grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" && {
  162.                         append ignore "${pid}"
  163.                         break
  164.                 }
  165.         done

  166.         # get all server pids that should be ignored
  167.         for server in `cat /var/run/${NAME}.*.pid`
  168.          do
  169.                 append ignore "${server}"
  170.         done

  171.         # get all running pids and kill client connections
  172.         local skip
  173.         for pid in `pidof "${NAME}"`
  174.          do
  175.                 # check if correct program, otherwise process next pid
  176.                 grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || {
  177.                         continue
  178.                 }

  179.                 # check if pid should be ignored (servers, ourself)
  180.                 skip=0
  181.                 for server in ${ignore}
  182.                  do
  183.                         if [ "${pid}" == "${server}" ]
  184.                          then
  185.                                 skip=1
  186.                                 break
  187.                         fi
  188.                 done
  189.                 [ "${skip}" -ne 0 ] && continue

  190.                 # kill process
  191.                 echo "${initscript}: Killing ${pid}..."
  192.                 kill -KILL ${pid}
  193.         done
  194. }
复制代码


这是现在(2.2.1 Build 240514 Rel.58724n)
  1. #!/bin/sh /etc/rc.common
  2. # Copyright (C) 2006-2010 OpenWrt.org
  3. # Copyright (C) 2006 Carlos Sobrinho

  4. START=50
  5. STOP=50

  6. SERVICE_USE_PID=1

  7. NAME=dropbear
  8. PROG=/usr/sbin/dropbear
  9. PIDCOUNT=0
  10. EXTRA_COMMANDS="killclients"
  11. EXTRA_HELP="        killclients Kill ${NAME} processes except servers and yourself"

  12. getNewPasswd()
  13. {
  14.         local key_code=`/usr/sbin/dbg_passwd_gen`
  15.         local key=$(echo ${key_code:0:6})
  16.         local code=$(echo ${key_code:6:38})
  17.         #echo "Password: $key" > /dev/console
  18.         echo "Authorized code: $code" > /dev/console
  19.         echo ${key}
  20.         echo ${code}
  21. }

  22. setNewPasswd()
  23. {
  24.         local ret=`getNewPasswd`
  25.         local newPasswd=`echo $ret | awk '{print $1}'`
  26.         local newAuthCode=`echo $ret | awk '{print $2}'`
  27.         #echo "newPasswd is $newPasswd" > /dev/console
  28.         (echo "$newPasswd";sleep 1;echo "$newPasswd") | passwd > /dev/null
  29.         uci set ${NAME}.$1.AuthCode="$newAuthCode"
  30.         uci commit ${NAME}
  31. }

  32. setDefaultPasswd()
  33. {
  34.         cp /rom/etc/passwd /etc/passwd &> /dev/null
  35. }

  36. dropbear_start()
  37. {
  38.         append_ports()
  39.         {
  40.                 local ifname="$1"
  41.                 local port="$2"

  42.                 grep -qs "^ *$ifname:" /proc/net/dev || {
  43.                         append args "-p $port"
  44.                         return
  45.                 }

  46.                 for addr in $(
  47.                         ifconfig "$ifname" | sed -ne '
  48.                                 /addr: *fe[89ab][0-9a-f]:/d
  49.                                 s/.* addr: *\([0-9a-f:\.]*\).*/\1/p
  50.                         '
  51.                 ); do
  52.                         append args "-p $addr:$port"
  53.                 done
  54.         }


  55.         local section="$1"

  56.         # Customized kill switch
  57.         config_get_bool ssh_port_switch "${section}" ssh_port_switch 0
  58.         echo "ssh_port_switch is $ssh_port_switch" > /dev/console
  59.         if [ "$ssh_port_switch" != "1" ]; then
  60.                 echo "set default passwd" > /dev/console
  61.                 setDefaultPasswd
  62.                 return 0
  63.         fi

  64.         # check if section is enabled (default)
  65.         local enabled
  66.         config_get_bool enabled "${section}" enable 1
  67.         [ "${enabled}" -eq 0 ] && return 1

  68.         # debug firmware use default password
  69.         setDefaultPasswd

  70.         # verbose parameter
  71.         local verbosed
  72.         config_get_bool verbosed "${section}" verbose 0

  73.         # increase pid file count to handle multiple instances correctly
  74.         PIDCOUNT="$(( ${PIDCOUNT} + 1))"

  75.         # prepare parameters (initialise with pid file)
  76.         local pid_file="/var/run/${NAME}.${PIDCOUNT}.pid"
  77.         local args="-P $pid_file"
  78.         local val
  79.         # A) password authentication
  80.         config_get_bool val "${section}" PasswordAuth 1
  81.         [ "${val}" -eq 0 ] && append args "-s"
  82.         # B) listen interface and port
  83.         local port
  84.         local interface
  85.         config_get interface "${section}" Interface
  86.         config_get interface "${interface}" ifname "$interface"
  87.         config_get port "${section}" Port 22
  88.         append_ports "$interface" "$port"
  89.         # C) banner file
  90.         config_get val "${section}" BannerFile
  91.         [ -f "${val}" ] && append args "-b ${val}"
  92.         # D) gatewayports
  93.         config_get_bool val "${section}" GatewayPorts 0
  94.         [ "${val}" -eq 1 ] && append args "-a"
  95.         # E) root password authentication
  96.         config_get_bool val "${section}" RootPasswordAuth 1
  97.         [ "${val}" -eq 0 ] && append args "-g"
  98.         # F) root login
  99.         config_get_bool val "${section}" RootLogin 1
  100.         [ "${val}" -eq 0 ] && append args "-w"
  101.         # G) host keys
  102.         config_get val "${section}" rsakeyfile
  103.         [ -f "${val}" ] && append args "-r ${val}"
  104.         config_get val "${section}" dsskeyfile
  105.         [ -f "${val}" ] && append args "-d ${val}"

  106.         # execute program and return its exit code
  107.         [ "${verbosed}" -ne 0 ] && echo "${initscript}: section ${section} starting ${PROG} ${args}"
  108.         SERVICE_PID_FILE="$pid_file" service_start ${PROG} ${args}
  109. }

  110. keygen()
  111. {
  112.         for keytype in rsa dss; do
  113.                 # check for keys
  114.                 key=dropbear/dropbear_${keytype}_host_key
  115.                 [ -f /tmp/$key -o -s /etc/$key ] || {
  116.                         # generate missing keys
  117.                         mkdir -p /tmp/dropbear
  118.                         [ -x /usr/bin/dropbearkey ] && {
  119.                                 /usr/bin/dropbearkey -t $keytype -f /tmp/$key 2>&- >&- && exec /etc/rc.common "$initscript" start
  120.                         } &
  121.                 exit 0
  122.                 }
  123.         done

  124.         lock /tmp/.switch2jffs
  125.         mkdir -p /etc/dropbear
  126.         mv /tmp/dropbear/dropbear_* /etc/dropbear/
  127.         lock -u /tmp/.switch2jffs
  128.         chown root /etc/dropbear
  129.         chmod 0700 /etc/dropbear
  130. }

  131. start()
  132. {
  133.         [ -s /etc/dropbear/dropbear_rsa_host_key -a \
  134.           -s /etc/dropbear/dropbear_dss_host_key ] || keygen

  135.         config_load "${NAME}"
  136.         config_foreach dropbear_start dropbear
  137. }

  138. stop()
  139. {
  140.         local pid_file pid_files

  141.         pid_files=`ls /var/run/${NAME}.*.pid 2>/dev/null`

  142.         [ -z "$pid_files" ] && return 1

  143.         for pid_file in $pid_files; do
  144.                 SERVICE_PID_FILE="$pid_file" service_stop ${PROG} && {
  145.                         rm -f ${pid_file}
  146.                 }
  147.         done
  148. }

  149. killclients()
  150. {
  151.         local ignore=''
  152.         local server
  153.         local pid

  154.         # if this script is run from inside a client session, then ignore that session
  155.         pid="$$"
  156.         while [ "${pid}" -ne 0 ]
  157.          do
  158.                 # get parent process id
  159.                 pid=`cut -d ' ' -f 4 "/proc/${pid}/stat"`
  160.                 [ "${pid}" -eq 0 ] && break

  161.                 # check if client connection
  162.                 grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" && {
  163.                         append ignore "${pid}"
  164.                         break
  165.                 }
  166.         done

  167.         # get all server pids that should be ignored
  168.         for server in `cat /var/run/${NAME}.*.pid`
  169.          do
  170.                 append ignore "${server}"
  171.         done

  172.         # get all running pids and kill client connections
  173.         local skip
  174.         for pid in `pidof "${NAME}"`
  175.          do
  176.                 # check if correct program, otherwise process next pid
  177.                 grep -F -q -e "${PROG}" "/proc/${pid}/cmdline" || {
  178.                         continue
  179.                 }

  180.                 # check if pid should be ignored (servers, ourself)
  181.                 skip=0
  182.                 for server in ${ignore}
  183.                  do
  184.                         if [ "${pid}" == "${server}" ]
  185.                          then
  186.                                 skip=1
  187.                                 break
  188.                         fi
  189.                 done
  190.                 [ "${skip}" -ne 0 ] && continue

  191.                 # kill process
  192.                 echo "${initscript}: Killing ${pid}..."
  193.                 kill -KILL ${pid}
  194.         done
  195. }
复制代码





以下是关键字段
  1. # 新计算方式
  2. getNewPasswd()
  3. {
  4.         local key_code=`/usr/sbin/dbg_passwd_gen`
  5.         local key=$(echo ${key_code:0:6})
  6.         local code=$(echo ${key_code:6:38})
  7.         #echo "Password: $key" > /dev/console
  8.         echo "Authorized code: $code" > /dev/console
  9.         echo ${key}
  10.         echo ${code}
  11. }


  12. #旧计算方式
  13. getNewPasswd()
  14. {
  15.         . /lib/functions.sh
  16.         local macAddr=""
  17.         macAddr=$(ubus call tddpServer getInfo '{"infoMask":1,"sep":"-"}' | sed 's/-//g' | jsonfilter -e '@.mac')
  18.         echo "macAddr from tddp config is $macAddr" > /dev/console

  19.         local key=$(echo -n "$macAddr" | md5sum)
  20.         key=$(echo ${key:0:16})
  21.         #echo "key is $key" > /dev/console

  22.         echo ${key}
  23. }
复制代码





根据这个脚本分析出TP-LINK在新版固件(指使用改版OpenWRT固件路由器)修改了ROOT密码计算方式
现在需要由dbg_passwd_gen这个二进制文件来生成不知道撒玩意的东西然后再去算
但是解包却没有看到这玩意的踪影
有点怀疑是TP-LINK是在更新后才释放这个文件,但是固件找不到也就提不出来
希望有大佬能折腾一下这玩意
爱生活,爱奶昔~
发表于 2025-2-19 04:19:28 来自手机 | 查看全部
既然能解包再封包,理论上替换shadow里的内容就可以啦,或者看看是不是有个启动时的uci配置教本自动重置了shadow内容
只要telnet能成功登录后,想怎么操作就怎么操作。都是敲命令
例如:
cd
ls
ls -l
cat
passwd
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

发表于 2025-2-19 04:20:42 来自手机 | 查看全部
binwalk解压原始固件,
squashfs-root文件系统
/etc目录
重新mksquashfs压缩回去。

楼主拿到shadow文件就可以替换了。用别的知道密码的openwrt的shadow替换密码部分就可以了
比如$1$/upNzzBq$n6dSjhrukZDsXFFm33doL1替换$1$tHiYRbC2$zCy8uUkCeF8Rwa8p2yPKX1。保存文件打包回去再上传,重启。
我给的$1$/upNzzBq$n6dSjhrukZDsXFFm33doL1就是admin。替换后root密码就是admin
我的TL-ER3210G提取出来的默认密码就是$1$tHiYRbC2$zCy8uUkCeF8Rwa8p2yPKX1。有高手能反推出密码吗?tp用openwrt内核的路由器是不是都是这个密码啊。
另外拿到root ttl进系统了后能改什么呢?改插件?
爱生活,爱奶昔~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 关注公众号
  • 添加微信客服
© 2025 Naixi Networks 沪ICP备13020230号-1|沪公网安备 31010702007642号
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表