999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于符號執行的緩沖區溢出漏洞自動化利用

2019-09-13 03:39:06胡建偉崔艷鵬
計算機應用與軟件 2019年9期
關鍵詞:程序利用

李 超 胡建偉 崔艷鵬

(西安電子科技大學網絡與信息安全學院 陜西 西安 710071)

0 引 言

信息技術的快速發展使得計算機軟件在社會活動與工業生產中起著越來越重要的作用。同時,軟件規模與數量的快速增長給信息安全帶來了嚴峻的挑戰。信息系統中存在軟件漏洞是導致信息安全問題的重要原因。軟件漏洞通常指軟件系統在設計、實現、配置、運行等過程中,由操作實體有意或無意產生的缺陷、瑕疵或錯誤,它們以不同形式存在于信息系統的各個層次與環節中。為確保信息系統的安全,眾多研究人員對漏洞分析與防護問題進行了大量的研究工作。然而,由于馮·諾依曼計算機體系自身的缺陷,以及當前軟件系統的代碼規模和技術復雜度的急劇提升,并且在軟件生命周期的每個階段都需要人工參與,難免會引入一些錯誤,導致無法徹底清除軟件中存在的漏洞。

在不能完全杜絕漏洞存在的情況下,需對其進行分析與研究,以最小化漏洞所帶來的損失。由于大多數商業軟件都不公開源碼,并且二進制代碼是軟件的最終表現形式,分析二進制代碼可以更加全面和直接地找到軟件中存在的漏洞,因此,二進制漏洞分析技術更具有實用性。文獻[1]的數據顯示,2017年新增漏洞中,緩沖區溢出漏洞為數量最多的漏洞類型,占新增漏洞總量的18.06%,遠遠高于其他漏洞類型。因此,研究緩沖區溢出漏洞具有重要意義。

面對各類信息系統中存在的大量漏洞,CNNVD[2]等組織對漏洞進行統一的分類管理,評估漏洞的危害性并將其標記為不同危害等級,指導軟件廠商采取相應的修復措施,從而減少漏洞帶來的威脅和損失。通常可利用的軟件漏洞具有很高的危害性,攻擊者往往通過這些漏洞控制目標系統。因此,在漏洞響應過程中,需要快速甄別大量軟件錯誤中的可利用漏洞。雖然使用模糊測試技術發現軟件錯誤具有很好的效果,但由于漏洞類型的多樣性和漏洞形成機理的復雜性,漏洞可利用性的評估和利用數據的構造通常需進行動態調試分析漏洞形成的細節,這個過程由分析人員以手工方式完成,并且要求分析人員熟悉匯編語言等計算機底層原理。隨著軟硬件產品和應用的快速增長,漏洞數量急劇攀升,2017年共發布漏洞信息13 417條,漏洞數量達到2016年的近2倍[1]。因此,傳統漏洞分析方式已難以應對上述挑戰。

為提高軟件漏洞風險評估的效率,本文研究緩沖區溢出漏洞,提出一種面向二進制程序的自動化漏洞利用方法,通過構建exploit證明漏洞的危害性。該方法首先使用符號執行檢測漏洞,然后構建路徑約束表達式和利用約束表達式,最后通過約束求解器求解得到exploit。

1 相關工作

目前已有學者對自動化漏洞利用進行了研究,并取得了一定的進展。由Brumley等[3]提出的APEG基于補丁比對的方法定位程序中已修補的漏洞,通過分析補丁中添加的過濾條件,構造不滿足過濾條件的輸入觸發漏洞。該方法無法適用于補丁中沒有添加過濾條件的情況,并且構造的輸入只能進行拒絕服務攻擊。相對于APEG對補丁的分析,Avgerinos等[4]提出了基于源碼的漏洞自動挖掘和利用方法AEG,AEG使用預置條件的符號執行找到程序漏洞,利用動態二進制插樁獲取程序運行時信息,構建約束表達式,并求解得到可實現控制流劫持攻擊的利用數據。

為了能夠在無法獲取程序源碼的情況下自動構造利用數據,Heelan[5]提出了基于二進制程序的漏洞自動利用方法。該方法以可觸發漏洞的樣例作為輸入,通過代碼插樁定位到漏洞,并使用污點分析找到可用于存放攻擊代碼的可控內存,構建生成利用數據所需的約束表達式,最后求解得到控制流劫持攻擊利用數據。Cha等[6]提出的漏洞自動利用生成方法Mayhem使用混合符號執行技術,分析過程中符號執行引擎在離線符號執行與在線符號執行間不斷切換,以減少內存消耗,緩解狀態爆炸問題。此外,該方法使用基于索引的內存模型優化符號化內存的加載提高系統效率。Wang等[7]提出自動化生成多樣性漏洞利用的方法PolyAEG,該方法以崩潰樣例為輸入,通過動態污點分析獲得程序執行的相關信息,構建污點傳播流圖和全局污點狀態記錄獲取程序中所有可能被控制的劫持點、跳板指令和內存區域,最后利用不同的跳轉指令和可控制內存區域構造多樣性的利用樣本。Huang等[8]提出的CRAX同樣以崩潰樣例為輸入對程序進行全系統模擬的符號執行分析,分析過程中對漏洞利用不相關的庫函數或內核函數進行具體執行,以優化符號執行,提高處理速度。該方法可適用于Microsoft office word等規模較大的應用程序。

相對于上述面向控制流的利用方法,Hu等[9]提出了面向數據流的自動利用方法FlowStitch,利用內存錯誤修改程序數據流中的關鍵變量,可達到敏感信息泄露或提權的攻擊效果。該方法可實現敏感信息泄露,因此實用性較強。其缺點是需要能觸發內存錯誤的輸入。由于堆管理機制的復雜性,導致堆漏洞利用的難度相對較大,Revery[10]對堆漏洞自動化利用問題進行了探索,在19個測試程序中可成功對9個程序生成利用。此外,NAVEX[11]對Web應用漏洞自動構造利用數據,可成功利用SQL注入和XSS漏洞,該方法與二進制漏洞利用有較大的差別。

綜上所述,APEG和AEG分別依賴于補丁和源碼檢測漏洞;Mayhem使用符號執行檢測漏洞,采用具體化部分符號變量的方法減少搜索空間,但可能導致漏洞不可利用;文獻[5]和文獻[7-9]均依賴于已知的崩潰輸入,無法自動檢測程序中存在的漏洞。此外,上述方法未考慮進程中不存在空間足以容納shellcode的可控內存塊的情況,構造利用的適用性較差。本文所提方法使用符號執行檢測漏洞,通過切片減少狀態數量,并改進漏洞利用時shellcode存放方式,可提高系統適用性。

2 緩沖區溢出漏洞自動化利用

緩沖區溢出漏洞產生的原因是程序未正確檢查用戶輸入數據的長度是否超過目標緩沖區的大小,向緩沖區寫入過多數據覆蓋了內存中其他數據,可能導致控制流劫持。通過緩沖區溢出劫持控制流的常見方法包括覆蓋棧中函數返回地址和覆蓋函數指針。利用代碼注入或代碼復用[12]可實現執行任意代碼。代碼注入將一段攻擊代碼寫入進程空間,之后劫持控制流到攻擊代碼執行;代碼復用將內存中已有的代碼片段拼接成可實現特定功能的攻擊鏈進行攻擊。本文主要研究代碼注入攻擊的自動化。

本文基于二進制分析框架angr[13]設計并實現緩沖區溢出漏洞自動利用原型系統AutoExp(Automatic Exploitation),該系統以漏洞程序為輸入,使用符號執行[14]檢測漏洞,通過構建約束表達式和約束求解生成exploit。以exploit作為程序輸入可觸發漏洞,并利用漏洞達到獲取系統控制權、運行任意代碼或竊取數據等目的。

如圖1所示,自動化生成exploit包括4個步驟:1) 預處理。為了減小漏洞檢測過程中符號執行的狀態空間,首先掃描目標程序中危險函數調用位置,然后通過程序切片技術獲取危險函數調用位置到程序入口點的代碼切片。2) 漏洞檢測。針對上一步得到的切片進行符號執行,記錄每個狀態的路徑約束、寄存器和符號內存信息。同時,每運行一步均檢測是否存在包含漏洞的狀態。3) 構建利用約束。找到漏洞后,判斷漏洞的可利用性,通過構建shellcode約束將可控內存區域的值約束為shellcode以實現攻擊代碼注入,構建EIP約束將EIP寄存器的值約束為shellcode存放地址以實現控制流劫持。4) 約束求解。使用約束求解器求解路徑約束和利用約束,若有解則成功生成exploit。

圖1 漏洞自動利用系統設計

2.1 基于符號執行的漏洞檢測

漏洞自動化利用的前提條件為找到程序中存在的漏洞,本文采用符號執行檢測漏洞。符號執行以符號變量代替具體值作為程序輸入,并動態模擬執行程序中的指令,在執行過程中記錄寄存器和內存狀態。當遇到分支語句時,復制程序狀態以便繼續分析所有分支,并構建路徑約束表達式記錄到達不同分支的路徑信息。符號執行過程中,根據不同漏洞模型設置違例斷言可檢測程序中存在的漏洞。

由于符號執行分析過程中每一個分支語句都可能導致新增一條路徑,所以路徑數量可能按指數級別增長,即存在狀態爆炸問題。為了緩解狀態爆炸問題,并且使分析過程更具有針對性,本文提出基于危險函數切片的方法獲取包含危險函數調用的程序切片,符號執行時根據切片剔除無關路徑。

2.1.1預處理

控制流劫持漏洞的利用主要關注漏洞脆弱點和控制流劫持點[15],漏洞脆弱點指導致漏洞產生的函數或指令,而控制流劫持點指程序控制流被輸入數據控制的指令。緩沖區溢出漏洞多是由于程序中使用了危險函數,并且未對用戶輸入數據進行嚴格的檢查所導致的。因此,緩沖區溢出漏洞的脆弱點往往為危險函數調用位置。常見危險函數如表1所示。

表1 危險函數列表

預處理過程如算法1所示,首先通過靜態分析獲取程序中的脆弱點位置。具體方法為,根據預先定義的危險函數名列表unsafe_func_name查找程序鏈接表PLT(Procedure Linkage Table)得到危險函數地址unsafe_func_addr;根據地址查找控制流圖CFG(Control Flow Graph)得到所有危險函數節點unsafe_nodes,獲取危險函數節點的前驅節點即可得到危險函數調用點地址列表unsafe_callsites。接著對危險函數調用點進行程序切片[16],得到從程序入口點到危險函數調用點的切片。具體方法為,分析程序數據依賴關系和控制依賴關系構建數據依賴圖ddg(Data Dependence Graph,DDG)和控制依賴圖cdg(Control Dependence Graph,CDG),根據ddg和cdg使用輕量級污點分析[17]從危險函數調用點target進行后向切片得到切片bk_slice。

算法1預處理

輸入:目標程序program, 危險函數名列表unsafe_func_name

輸出:程序切片bk_slice

1 plt = get_plt(program)

// 獲取程序 plt 信息

2 cfg = create_cfg(program)

// 構建程序CFG

/* 獲取每個危險函數的調用點 */

3 for fname in unsafe_func_name:

4 unsafe_func_addr = plt[fname]

// 根據CFG得到程序中所有危險函數節點

5 unsafe_nodes = cfg.get_all_nodes(unsafe_func_addr)

// 獲取危險函數節點的前驅節點得到危險函數調用點

6 for node in unsafe_nodes:

7 unsafe_callsites.append(node.predecessors.addr)

/* 根據危險函數調用點進行切片 */

8 ddg = create_ddg(cfg)

// 構建DDG

9 cdg = create_cdg(cfg)

// 構建CDG

10 for target in unsafe_callsites:

11 bs=create_backward_slice(cfg, ddg, cdg, target)

//切片

12 bk_slice.append({‘target’: addr, ‘slice’: bs})

13 return bk_slice

2.1.2漏洞檢測

符號執行引擎[13]在模擬運行程序時,以狀態(state)表示程序的執行過程,其中記錄了程序的執行路徑和內存、寄存器等運行時信息;使用模擬管理器(SimulationManager)控制符號執行過程,可管理不同類型的狀態和使用搜索策略探索程序狀態空間。SimulationManager通過stash管理active、found、unconstrained等不同類型的狀態,active state為當前正執行的狀態,found state為通過設定探索目標所找到的狀態unconstrained state為不受約束的狀態。

符號執行以符號值替換用戶輸入,如果程序中存在緩沖區溢出漏洞,當程序運行到漏洞劫持點時EIP寄存器將被符號化,由于符號化變量不是具體值,符號執行引擎不能確定下一步需執行的指令,導致無法繼續運行,此時狀態類型為unconstrained。因此,通過判斷符號執行過程中是否存在unconstrained狀態即可檢測緩沖區溢出漏洞。

算法2描述了漏洞檢測方法。符號執行過程中,在程序入口點與脆弱點間運行時根據預處理得到的切片進行狀態修剪,剔除切片之外的路徑,以減少狀態數量。具體方法為,符號化用戶輸入并創建模擬管理器simgr,接著獲取切片bk_slice中脆弱點地址(即危險函數調用點)target作為符號執行的探索目標。同時設定狀態修剪策略函數drop_states_not_in_slice,該函數判斷active stash中的狀態是否在切片范圍內,若是則返回False,即保留該狀態;否則返回True,丟棄該狀態。當找到脆弱點狀態后,丟棄active中所有狀態,并把脆弱點狀態從found stash移動到active stash以便從脆弱點繼續運行;找到脆弱點之后繼續執行,當unconstrained stash非空時則表明存在控制流劫持點,即找到漏洞狀態vul_state。

算法2漏洞檢測

輸入:目標程序program, 切片bk_slice

輸出:漏洞狀態vul_state

1 for slice in bk_slice:

/*程序入口點到脆弱點間運行時根據切片進行狀態修剪*/

2 sym_input = symbolic(input)

// 符號化用戶輸入

3 init_state = entry_state(program, sym_input)

//創建初始狀態

4 simgr = simulation_manager(init_state)

// 創建模擬管理器

5 target = slice[‘target’]

// 獲取脆弱點地址

// 以脆弱點為目標進行符號執行,并設定狀態修剪策略

6 simgr.explore(find=target, filter=drop_states_not_in_slice)

// 若找到脆弱點狀態,則使active stash中只包含該狀態

7 if simgr.found not NULL:

8 simgr.drop(stash=′active′)

9 simgr.move(from_stash=″found″, to_stash=″active″)

/* 從脆弱點繼續探索,直到找到unconstrained狀態 */

10 while simgr.unconstrained is NULL:

11 simgr.step()

// 向前執行一步

12 vul_state = simgr.unconstrained

13 return vul_state

2.2 基于約束求解的利用生成

2.2.1利用約束構建

進程空間中存在可控內存塊是進行代碼注入攻擊的必要條件。進程中可控內存區域并非都是連續的,為了找到能存放shellcode的可控內存塊,需獲取可控內存塊信息,包括內存塊的起始地址和大小。獲取可控內存塊信息的方法如算法3所示,首先獲取漏洞狀態vul_state中符號化內存地址列表sym_addrs;然后根據地址是否連續來統計內存塊的大小size,并記錄內存起始地址buf_start;最后將內存塊按空間從大到小的順序排序。

算法3獲取可控內存塊信息

輸入:漏洞狀態vul_state

輸出:符號化內存塊sym_bufs

// 獲取符號化內存地址列表

1 sym_addrs = find_symbolic_addr(vul_state)

2 while sym_addrs not NULL:

3 size = 0

// 設定內存塊初始大小

4 buf_start = sym_addrs[0]

// 記錄內存塊起始地址

/* 統計連續內存地址組成的內存塊大小 */

5 while True:

6 if not buf_start + size in sym_addrs:

7 break

8 sym_addrs.remove(buf_start + size)

//刪除已處理地址

9 size += 1

10 sym_bufs.append({‘addr’: buf_start, ‘size’: size})

11 sorted_by_size(sym_bufs)

// 根據內存塊大小排序

12 return sym_bufs

當進程空間中不存在足以容納shellcode的可控內存塊時,現有方法將無法成功構建exploit。如圖2所示,為提高漏洞自動利用系統的適用性,AutoExp把shellcode分段存放在多個可控內存塊,并使用跳轉指令連接不同內存塊中的攻擊代碼,從而完成攻擊過程。

圖2 shellcode分段存放

對shellcode分段時應確保指令的完整性,本文將機器碼形式的shellcode反匯編為匯編指令,分段時以指令為基本單位。算法4具體描述了分段的方法,首先反匯編shellcode為匯編指令asm,根據可控內存塊信息與shellcode大小確定分段數量和每個片段的長度segs_len;接著根據片段長度對shellcode進行分段;最后在除末尾片段外的所有片段后添加跳轉指令jmp_ins。

算法4shellcode分段

輸入:符號化內存塊sym_bufs, 攻擊代碼shellcode

輸出:shellcode片段sc_segments

1 asm = disassemble(shellcode)

// 反匯編shellcode

/* 確定每個片段的長度 */

2 length = 0, n = 0

// 初始化片段長度length和內存塊序號n

3 for ins in asm:

// 若當前內存塊還能容納指令ins,則劃分在該內存塊

4 if length + ins.size <= sym_bufs[n].size-len(jmp_ins):

5 length += ins.size

6 else:

// 否則,當前內存塊已存滿,考慮下一個內存塊

7 segs_len.append(length)

8 length = 0, n += 1

/* 在除末尾片段外的所有片段后添加跳轉指令 */

9 for len in segs_len not last:

10 sc_segments.append(shellcode[:len] + jmp_ins)

11 shellcode = shellcode[len:]

// 刪除已處理的數據

12 sc_segments.append(shellcode)

13 return sc_segments

利用緩沖區溢出漏洞進行代碼注入攻擊需要兩個步驟,分別是把攻擊代碼寫入進程空間和劫持程序控制流到攻擊代碼處,該過程可通過構建shellcode約束表達式和EIP約束表達式的方法實現自動化。如算法5所示,首先需把shellcode片段寫入進程中對應的可控內存塊,實現方法為依次加載可控內存塊sym_bufs[n],并構建約束表達式將內存塊中數據約束為對應的shellcode片段sc_segments[n];接著構建約束表達式將漏洞狀態的EIP寄存器值約束為shellcode存放內存的起始地址sym_bufs[0].addr。

算法5構建利用約束

輸入:漏洞狀態vul_state, 符號化內存塊sym_bufs, shellcode片段sc_segments

輸出:約束表達式constraints

/* 依次約束可控內存塊中數據為對應shellcode片段的值 */

1 for n in range(len(sc_segments)):

// 加載可控內存塊

2 memory = vul_state.load_mem(sym_bufs[n].addr)

// 將可控內存塊中數據約束為shellcode

3 vul_state.add_constraints(memory == sc_segments[n])

4 constraints.append(memory == sc_segments[n])

/* 約束EIP寄存器的值為shellcode起始地址 */

5 vul_state.add_constraints(vul_state.eip == sym_bufs[0].addr)

6 constraints.append(vul_state.eip == sym_bufs[0].addr)

7 return constraints

2.2.2約束求解

對于上述構建的路徑約束表達式和利用約束表達式,使用支持SMT求解理論的Z3求解器[18]進行求解。若有解,則得到一個可觸發漏洞并進行代碼注入攻擊的exploit;若無解,則表明檢測到的漏洞無法利用。

3 實驗與分析

實驗運行環境為Intel Core i7-7700HQ CPU,主頻2.8 GHz,4 GB內存, Ubuntu 16.04 64 bits系統,測試程序使用gcc 5.4.0 編譯。本文不考慮漏洞緩解機制的繞過,編譯時不啟用NX和Stack Canary保護,同時關閉系統ASLR保護[19]。為驗證系統的有效性,本文設置兩組實驗,分別用于驗證漏洞檢測效果和測試自動生成利用數據的有效性。

3.1 漏洞檢測

實驗選取以下3個已披露漏洞作為測試樣本,分別使用angr和本文實現的AutoExp檢測目標程序中存在的漏洞,并記錄兩種方法檢測漏洞所需時間。實驗結果如表2所示,表中第三列和第四列分別為目標程序的基本塊數量和使用AutoExp進行預處理所得切片的基本塊數量。從實驗數據可知,使用切片技術對程序進行預處理可減少待分析程序的基本塊數量,從而有效減小符號執行分析的復雜度。

表2 漏洞檢測結果

表2使用兩種方法檢測漏洞所需時間。實驗數據表明,當程序結構較簡單且基本塊數量較少時,直接使用angr進行符號執行分析能更快地檢測到漏洞;而隨著程序基本塊數量的增大,angr檢測漏洞所需時間遠遠多于AutoExp。具體原因如圖3所示,AutoExp在預處理階段構建CFG需花費較多的時間,但是預處理可避免分析與漏洞無關的路徑,從而在符號執行階段花費的時間相對angr要少,且消耗的內存也隨之減少。測試結果中,AutoExp檢測PSUtils中漏洞所需時間為127.05 s,而angr所需時間是AutoExp的15倍,分析代碼發現程序中switch語句會導致狀態爆炸問題,該語句與漏洞路徑無關,進行代碼切片能避免分析該語句,使得符號執行效率得以提高。由此可見,對于結構較復雜的程序而言,本文所提方法可極大提高漏洞檢測的效率。

圖3 漏洞檢測時間對比

3.2 漏洞利用

為驗證系統自動生成exploit的適用性,以圖4中漏洞程序memo和上述3個漏洞程序進行測試,測試時選取長度為25 bytes的shellcode利用漏洞。memo程序第14行調用read函數獲取用戶輸入到緩沖區buf中,由于第15行strcpy函數往數組title中寫入過多的數據而導致緩沖區溢出漏洞,從而覆蓋相鄰內存中函數指針func_ptr,利用該漏洞可劫持控制流進行代碼注入攻擊。

1typedefstructmemo{2charcontent[22];3time_ttime;4chartitle[15];5int(?func_ptr)();6}memorandum;7memorandummemo;8intmessage(){9printf(″%s″,memo.title);10}11intmain(){12charbuf[22];13memo.func_ptr=message;14read(0,buf,sizeof(buf));15strcpy(memo.title,buf);16read(0,buf,sizeof(buf));17strcpy(memo.content,buf);18time(&memo.time);19memo.func_ptr();20}

圖4 緩沖區溢出漏洞程序memo

實驗結果如表3所示,AutoExp可成功利用4個漏洞,而Mayhem[7]由于未考慮可控內存塊不足以容納shellcode的情況,因此無法成功利用memo中漏洞。實驗結果表明,本文所提方法相對Mayhem具有更好的適用性。

表3 漏洞自動利用結果對比

下面具體分析AutoExp自動生成exploit的效果。程序memo中存在content[22] 和title[15] 兩塊連續可控內存,利用過程中選取不同長度的shellcode,AutoExp可根據內存塊能否容納shellcode采取不同的exploit構造方法。如圖5所示,當選取長度為21 bytes的shellcode利用漏洞時,由于存在能容納shellcode的可控內存塊,故選擇可控內存塊content[22]注入shellcode構造利用。

圖5 shellcode連續存放

如圖6所示,當選取長度為25 bytes的shellcode利用漏洞時,由于不存在可容納shellcode的內存塊,故將shellcode分段存放在content[22]和title[15]中,并用指令“eb 07”實現不同分段間的跳轉。

圖6 shellcode分段存放

上述結果表明,本文所提方法可根據漏洞程序中可控內存塊的大小和所選取的shellcode調整exploit構造方法,具有更好的適用性。

4 結 語

本文對漏洞自動化利用方法進行了總結,提出一種基于符號執行的緩沖區溢出漏洞自動化利用方法。該方法采用危險函數切片減少漏洞檢測中符號執行的狀態數量,可有效緩解狀態爆炸問題,提高符號執行的效率。在漏洞利用階段,當進程中不存在空間足夠的可控內存塊時,將shellcode進行分段存放,具有更好的適用性。本文實現了緩沖區溢出漏洞利用的自動化,后續工作可進一步研究其他類型漏洞的自動化利用,以及自動繞過程序和系統中部署的漏洞緩解機制。

猜你喜歡
程序利用
利用min{a,b}的積分表示解決一類絕對值不等式
中等數學(2022年2期)2022-06-05 07:10:50
利用倒推破難點
利用一半進行移多補少
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
利用數的分解來思考
Roommate is necessary when far away from home
失能的信仰——走向衰亡的民事訴訟程序
“程序猿”的生活什么樣
利用
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
主站蜘蛛池模板: 欧美国产另类| 亚洲制服丝袜第一页| 国产一区二区精品福利| 欧美色综合网站| 广东一级毛片| a级毛片免费看| 91精品国产自产在线老师啪l| 免费看黄片一区二区三区| 亚洲无码A视频在线| 国产丝袜无码一区二区视频| 国产91丝袜在线播放动漫 | 青草视频久久| 性色生活片在线观看| 欧美日韩综合网| 国产无人区一区二区三区| 三级毛片在线播放| 国产激爽大片在线播放| 伊人五月丁香综合AⅤ| 国产免费看久久久| 熟妇无码人妻| lhav亚洲精品| 免费网站成人亚洲| 日本尹人综合香蕉在线观看| 亚洲成人免费看| 特级毛片8级毛片免费观看| 中文字幕伦视频| 久久香蕉国产线看观看精品蕉| 蜜桃臀无码内射一区二区三区 | 色屁屁一区二区三区视频国产| 毛片在线看网站| 中文字幕自拍偷拍| 久久精品国产亚洲麻豆| 国产一级妓女av网站| 国产无码精品在线播放| 国产精品亚洲综合久久小说| 久久亚洲精少妇毛片午夜无码| 亚洲成肉网| 日韩av在线直播| 爆乳熟妇一区二区三区| 日本免费福利视频| 91口爆吞精国产对白第三集| 亚洲高清在线播放| 亚洲精品国产成人7777| 国产日韩欧美在线播放| 国产亚洲精品91| 亚洲欧美日韩久久精品| 亚洲无码在线午夜电影| 成人午夜亚洲影视在线观看| 国产AV无码专区亚洲精品网站| 久久亚洲天堂| 五月婷婷欧美| 99这里精品| 婷婷六月综合网| 欧美怡红院视频一区二区三区| 国产自视频| 日韩无码黄色网站| 91成人精品视频| 91在线国内在线播放老师| 亚洲视频免费在线看| 国产精品美女免费视频大全| 欧美精品在线免费| 久久伊人色| 国产亚洲欧美在线视频| 亚洲一区波多野结衣二区三区| 国产av剧情无码精品色午夜| 亚洲美女一区二区三区| 免费一级毛片| 国产区精品高清在线观看| 国产网站免费| 国产毛片久久国产| 欧美中文字幕一区| jijzzizz老师出水喷水喷出| 成人亚洲天堂| 日韩在线观看网站| 99热这里只有精品5| 亚洲精品福利视频| 欧美一级高清片久久99| 日韩AV手机在线观看蜜芽| 久久不卡国产精品无码| a网站在线观看| 欧美丝袜高跟鞋一区二区| 超碰免费91|