GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

开启sshd和ftpd

 

 

关键发现
用户账户状态:

root:可用,但可能没有密码(shadow文件没有root行)

osgi:有加密密码

user:有加密密码

ftp:不能登录(shell是/bin/false)

当前root用户:您已以root身份登录,但shadow文件没有root行,说明root可能没有密码或使用其他认证方式

解决方案
第一步:修复防火墙规则
之前发现SSH和FTP在hg_serv_lan_blacklist和hg_serv_wan_blacklist链中被拒绝。需要删除这些规则:

bash
# 删除LAN黑名单中的拒绝规则
iptables -D hg_serv_lan_blacklist 3  # SSH拒绝规则
iptables -D hg_serv_lan_blacklist 2  # FTP拒绝规则

# 删除WAN黑名单中的丢弃规则
iptables -D hg_serv_wan_blacklist 2  # SSH丢弃规则
iptables -D hg_serv_wan_blacklist 1  # FTP丢弃规则

# 验证规则已删除
iptables -L hg_serv_lan_blacklist -n --line-numbers
iptables -L hg_serv_wan_blacklist -n --line-numbers
第二步:确保SSH和FTP服务运行
bash
# 确保Dropbear SSH运行
ps | grep dropbear
if [ $? -ne 0 ]; then
    dropbear -p 22
fi

# 确保FTP运行
ps | grep tcpsvd
if [ $? -ne 0 ]; then
    tcpsvd 0.0.0.0 21 ftpd -w / &
fi
第三步:设置或确认root密码
bash
# 检查root是否有密码
passwd -S root 2>/dev/null

# 如果没有设置,设置root密码
if [ $? -ne 0 ]; then
    echo "设置root密码:"
    passwd root
fi

# 或者直接设置密码
echo "root:newpassword" | chpasswd
第四步:测试连接
现在从Windows测试:

bash
# 测试SSH
ssh root@192.168.1.1

# 或者使用osgi用户
ssh osgi@192.168.1.1

# 测试FTP
ftp 192.168.1.1
第五步:永久生效配置(如果需要)
bash
# 保存iptables规则
iptables-save > /etc/iptables.rules 2>/dev/null

# 或者添加到启动脚本
echo "iptables -D hg_serv_lan_blacklist 3" >> /etc/rc.local
echo "iptables -D hg_serv_lan_blacklist 2" >> /etc/rc.local
echo "iptables -D hg_serv_wan_blacklist 2" >> /etc/rc.local
echo "iptables -D hg_serv_wan_blacklist 1" >> /etc/rc.local
echo "dropbear -p 22" >> /etc/rc.local
echo "tcpsvd 0.0.0.0 21 ftpd -w / &" >> /etc/rc.local
备用方案
如果删除规则后仍然无法连接:
检查INPUT链规则位置:

bash
# 将22和21端口规则移到INPUT链前面
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 21 -j ACCEPT
尝试不同端口:

bash
# 停止当前服务
killall dropbear
killall tcpsvd

# 使用其他端口
dropbear -p 2222
tcpsvd 0.0.0.0 2121 ftpd -w / &
检查其他防火墙链:

bash
# 检查是否有其他链也拒绝了22/21端口
iptables -S | grep -E "dpt:(22|21)" | grep -E "(DROP|REJECT)"
用户管理建议
1. 启用FTP用户
bash
# 修改ftp用户的shell为可登录
sed -i 's#/bin/false#/bin/ash#' /etc/passwd

# 设置ftp用户密码
echo "ftp:ftppassword" | chpasswd
2. 创建专用SSH用户
bash
# 创建新用户
adduser sshuser -s /bin/ash

# 设置密码
echo "sshuser:password123" | chpasswd
快速命令汇总
执行以下命令修复问题:

bash
# 1. 删除防火墙拒绝规则
iptables -D hg_serv_lan_blacklist 3
iptables -D hg_serv_lan_blacklist 2
iptables -D hg_serv_wan_blacklist 2
iptables -D hg_serv_wan_blacklist 1

# 2. 确保服务运行
killall dropbear 2>/dev/null
dropbear -p 22
killall tcpsvd 2>/dev/null
tcpsvd 0.0.0.0 21 ftpd -w / &

# 3. 设置root密码
echo "root:your_password_here" | chpasswd

# 4. 测试本地连接
nc -zv 127.0.0.1 22
nc -zv 127.0.0.1 21
从Windows测试
修改后,立即从Windows测试:

bash
# SSH连接
ssh root@192.168.1.1
# 密码:your_password_here

# FTP连接
ftp 192.168.1.1
# 用户名:root
# 密码:your_password_here
注意:由于嵌入式系统的特性,重启后这些更改可能会丢失。如果需要永久生效,需要找到保存配置的方法或修改启动脚本。

请先执行防火墙规则删除命令,然后告诉我是否可以从外部连接了。

 

 

解决方案
1. 创建/root目录在可写位置
bash
# 尝试在可写位置创建/root目录
mkdir -p /tmp/root
chmod 700 /tmp/root
chown root:root /tmp/root

# 或者使用/var目录(也是tmpfs)
mkdir -p /var/root
chmod 700 /var/root
chown root:root /var/root
2. 修改root用户的家目录
bash
# 备份passwd文件
cp /etc/passwd /tmp/passwd.backup

# 修改root的家目录到/tmp/root
sed -i 's#:/root:#:/tmp/root:#' /etc/passwd

# 验证修改
cat /etc/passwd | grep root
3. 创建.profile文件
bash
cat > /tmp/root/.profile << 'EOF'
#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export HOME=/tmp/root
export USER=root
export TERM=linux
export PS1='\u@\h:\w\\$ '
cd $HOME
EOF

chmod 644 /tmp/root/.profile
4. 创建必要的符号链接(可选)
bash
# 如果需要,创建root的符号链接
ln -sf /tmp/root /root 2>/dev/null
5. 重启dropbear并测试
bash
# 重启dropbear
killall dropbear 2>/dev/null
dropbear -p 22 &

# 检查服务状态
ps | grep dropbear
netstat -tln | grep :22
完整的修复脚本
执行以下脚本:

bash
#!/bin/sh
echo "=== 修复SSH连接(只读根文件系统)==="
echo ""

echo "1. 在/tmp创建root目录..."
mkdir -p /tmp/root
chmod 700 /tmp/root
chown root:root /tmp/root
ls -ld /tmp/root
echo ""

echo "2. 修改/etc/passwd..."
cp /etc/passwd /tmp/passwd.backup
sed -i 's#root:[^:]*:[^:]*:[^:]*:[^:]*:/root:#root:XKONnF5xArZ/s:0:0:root:/tmp/root:#' /etc/passwd
echo "修改后的root行:"
cat /etc/passwd | grep ^root
echo ""

echo "3. 创建.profile文件..."
cat > /tmp/root/.profile << 'EOF'
#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export HOME=/tmp/root
export USER=root
export TERM=linux
export PS1='\u@\h:\w\\$ '
cd $HOME
EOF
chmod 644 /tmp/root/.profile
ls -la /tmp/root/.profile
echo ""

echo "4. 重启dropbear..."
killall dropbear 2>/dev/null
dropbear -p 22 &
sleep 2
echo "Dropbear进程:"
ps | grep dropbear
echo ""

echo "5. 端口监听状态..."
netstat -tln | grep :22
echo ""

echo "修复完成!现在可以尝试从Windows连接:"
echo "ssh root@192.168.1.1"
持久化方案(重启后不丢失)
由于/etc目录是tmpfs,重启后修改会丢失。需要创建启动脚本:

bash
# 创建持久化脚本
cat > /usr/cmcc_app/fix_ssh.sh << 'EOF'
#!/bin/sh
# 修复SSH连接脚本
mkdir -p /tmp/root
chmod 700 /tmp/root
chown root:root /tmp/root

# 修改passwd文件(如果尚未修改)
if ! grep -q ":/tmp/root:" /etc/passwd; then
    sed -i 's#:/root:#:/tmp/root:#' /etc/passwd
fi

# 创建.profile文件
cat > /tmp/root/.profile << 'PROFILE_EOF'
#!/bin/sh
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export HOME=/tmp/root
export USER=root
export TERM=linux
export PS1='\u@\h:\w\\$ '
cd $HOME
PROFILE_EOF
chmod 644 /tmp/root/.profile

# 启动dropbear
killall dropbear 2>/dev/null
dropbear -p 22 &
EOF

chmod +x /usr/cmcc_app/fix_ssh.sh

# 添加到启动
echo "/usr/cmcc_app/fix_ssh.sh" >> /etc/rc.local 2>/dev/null

 

 

 # iptables -D hg_serv_lan_blacklist 2
/ # killall tcpsvd 2>/dev/null
/ # tcpsvd 0.0.0.0 21 ftpd -w -a nobody /tmp/ftp_anon &
/ # mkdir -p /tmp/ftp_anon
/ # chmod 755 /tmp/ftp_anon
/ # echo "Welcome to Anonymous FTP Server" > /tmp/ftp_anon/WELCOME.txt
/ # echo "Upload directory is /upload" >> /tmp/ftp_anon/WELCOME.txt
/ #
/ # killall tcpsvd 2>/dev/null
[1]+  Terminated                 tcpsvd 0.0.0.0 21 ftpd -w -a nobody /tmp/ftp_anon
/ # tcpsvd 0.0.0.0 21 ftpd -w -a nobody / &
/ #

 

posted on 2025-12-29 10:26  GKLBB  阅读(0)  评论(0)    收藏  举报