信息安全 學習筆記(4)—— 【復習綱要】


信息安全課程:復習綱要

問答題[60分]: 

一、ARP協議問題。

  • ARP協議的作用是什么。
  • 引入ARP緩存的功能是什么。
  • ARP緩存中毒的攻擊方法和效果是什么。

二、IP協議安全問題

  • 為什么IP要進行分片?
  • IP分片如何進行重組?
  • 淚滴攻擊(teardrop)的原理是什么?
  • 包過濾防火牆,通過過濾SYN包,防止外部鏈接。攻擊者可以如何繞過這個過濾?

三、ICMP協議安全。

  • 什么是SMURF攻擊?如何防止?
  • 什么是ICMP重定向攻擊?如何防止?

四、TCP協議安全。

  • 什么是SYN flooding攻擊?效果是什么?如何防止?
  • 端口掃描的原理是什么?
  • nmap -sS和nmap -sT的區別是什么?
  • nmap -sA掃描的原理是什么?
  • nmap idle掃描的原理是什么?

五、防火牆。

  • iptables是狀態防火牆。狀態防火牆相比於包過濾防火牆的優點是什么?
  • NAT的作用是什么?
  • sudo iptables –P INPUT DROP; iptables -A INPUT -p tcp --sport 80 -j ACCEPT 這兩條語句的作用是什么?

六、Rootkit。

  • 什么是rootkit?
  • LKM的好處是什么?
  • 請描述系統調用劫持的過程。
  • 請解釋,為何Unix可以做到一切皆文件。

七、緩沖區溢出。

  • 什么是返回地址?
  • 匯編語言中,call指令的作用是什么?
  • 請描述當函數調用發生時,進程地址空間中棧幀的變化。
  • 如何防止緩沖區溢出攻擊。

 

 

一、ARP協議相關

Dos攻擊:netwox 80 使用ARP攻擊,阻止局域網內系統正常聯網

ARP:IP-->MAC

  主機廣播IP來尋找MAC,返回是單播;

  然后(所有主機都)緩存IP--MAC的對應關系到ARP表,

  但ARP表不是一成不變的,因為IP--MAC對應關系不斷改變。(比如:虛擬機中的IP地址,多啟動幾回可能就換掉了)

局域網(以太網)幀格式:

幀類型 Frame types:    0800 IP     0806 ARP     8035 RARP

了解以太網幀的格式之后,就可以根據幀的結構發包;也可以借助netwox 80發ARP包,導致同在一個局域網的另一個主機不能聯網。

 

1)ARP協議的作用是什么?

地址解析,根據IP地址獲取對應的mac地址。

 

2)引入ARP緩存的功能是什么?

將ip和mac的映射保存在本地,防止每次發送ip數據包之前都要進行一次ARP解析。

 

3)ARP緩存中毒的攻擊方法和效果是什么?

因為ARP緩存是無狀態的,只要每次接收到ARP信息就對ARP緩存進行更新。

攻擊方法用netwox 80發包,對主機X 發送一個假的ARP應答報文,將X 的ARP緩存中的ip映射到一個錯誤的mac地址

效果:使得被攻擊主機不能聯網

 

二、IP協議安全問題

以太網幀:frame_head+frame_data(ip數據報:iphead+ipdata)

ip頭部:

 

1)為什么IP要進行分片?

主要是因為硬件環境的MTU限制

單個IP報文65535的最大長度;

但是網絡硬件限制了幀的大小(限制以太網1500字節)。

 

2)IP分片如何進行重組?

1.標識(IDENT,用於標識IP報文段的唯一標識符,具有同一IDENT的片段屬於同一個IP報文)、

2.標志(FLAGS,第一位保留,不使用;第二位為DF(Don't Fragment)位,DF=1時不分片;第三位為MF(More Fragments)位,DF=0的情況下,除了最后一個分段的IP包的包頭,其他分段的MF位都設為1)

3.片偏移(FO:FRAGMENT OFFSET,指明當前片段在原始完整的IP報文中的位置(偏移)。該偏移的單位是8個字節。)

 

3)淚滴攻擊(TearDrop)的原理是什么?

構造兩個分片,滿足以下兩個條件:

1、第二個分片完全包含在第一個分片中。(第一個分片的FO+len > 第二個分片的FO+len)

2、發生重疊時,使用第一個分片來覆蓋第二個分片的重疊內容

由於第二個分片完全包含在第一個分片中,計算第二分片剩余部分的長度 len= end- pre_end 為負數

又因為剩余長度的數據結構為unsigned,導致產生一個特別大的數。

導致拷貝超多無關數據導致內存占用過多以及系統崩潰。

  

( 解決方法:加上一個 if 判斷語句,來保證 end-pre_end>0 )

 

 

4)包過濾防火牆,通過過濾SYN包,防止外部鏈接。攻擊者可以如何繞過這個過濾?

1. 微小碎片攻擊:使得第一個分片不包含SYN字段。第二個分片包含TCP的SYN=1字段。這樣兩個分片都能通過防火牆,然后在上層進行重組SYN包。

2. 重疊碎片攻擊:如果系統采用的重疊方式后一片覆蓋前一片的情況下,可以使用碎片重疊攻擊,使得第一個分片的SYN字段不為1,第二個分片的FO!=0並包含TCP的SYN=1字段。這樣兩個分片也都能通過防火牆,然后在上層重組,第二個分片覆蓋第一個分片后就能重新組成SYN包。

 

【詳細版——分片攻擊

防火牆通過數據包包頭信息,進行攔截(包過濾器防火牆)

RFC:互聯網國際標准機構 Request For Comment

原有協議:有些端口阻止 外部訪問請求,但是接受 對本機請求的回復(本機先發出請求)

漏洞是:只檢查FO=0(第一個)數據片。

只要第一個混過去(包裝成無害的樣子),后面(具有同樣IDentifier標識符的)分片可以跟着全部通過防火牆

(1)微小碎片攻擊

攻擊方法

強迫TCP頭部進入第二個分片,從而躲過防火牆過濾器的匹配(SYN)

通過許多IP實現,可以在發出數據包上形成異常小的片段大小。如果片段大小足夠小以迫使某些TCP數據包的TCP頭字段進入第二個片段,則指定這些字段的模式的過濾規則將不匹配。如果過濾實現沒有強制執行最小片段大小,則可能會通過不允許的數據包,因為它在過濾器中沒有得到匹配。

防止措施

  • 直接法:FO=0的包長度<min,丟之
  • 間接法:若存在FO=1的分片,丟之 (ps:FO=2以上就可以了)

 

(2) 重疊碎片攻擊

攻擊方法

用第二個分片(有害),覆蓋第一個無害分片(用於頂包接受檢查)。       

例如:第一個分片 SYN = 0,ACK = 1(應答)

第二個分片 SYN = 1,ACK = 0 (請求連接)

這樣在重組之后就是有害的報文。

防止措施

丟掉FO==1,且protocal==TCP 的包(此方法不徹底夠用)

 

 

 

三、ICMP協議安全

ICMP: 互聯網消息控制協議

明確一點信息,本身就是ICMP差錯報文的情況下,不會產生ICMP差錯報文。但是,ICMP查詢報文可能會產生ICMP差錯報文。

ICMP報文格式:

 

 

 

1)什么是SMURF攻擊?如何防止?

Smurf攻擊是一種DDOS攻擊。

冒充受害者的IP地址,將大量ICMP的ECHO REQUEST廣播到有大量主機的網絡。默認情況下,網絡上的大多數設備都會通過向源IP地址發送回復ECHO REPLY來對此做出響應。 如果網絡上接收和響應這些數據包的機器數量非常大,受害者的計算機將忙於處理 ping 回復包。 這可能會使受害者的計算機變慢,無法繼續工作。

(DDOS==分布式拒絕服務;DOS==拒絕服務;ICMP==互聯網控制消息協議)

如何防止Smurf攻擊呢?

1. 配置各個主機和路由器,不響應ICMP請求或廣播;

2. 配置路由器不轉發定向到廣播地址的數據包。

 

 

2)什么是ICMP重定向攻擊?如何防止?【考試重點,應該會展開考實驗細節】

A:攻擊者

B:受害者

C:受訪問的網絡

首先,當B要訪問C網絡的時候,會向當前網關發送訪問請求。A通過pcap網絡嗅探等工具捕獲這一請求的時候,A冒充B的網關向B發送ICMP重定向報文,將網關地址重定向為虛假地址。當B收到A發送的重定向報文的時候,就會修改B的路由表,將訪問C網絡的網關地址改為重定向的地址。這樣B上網會發生部分失敗(因為路由器會更新正確的路由給B,但A會改成錯的,兩者互相改,造成部分對部分錯)

防御手段:過濾掉ICMP重定向報文

實驗流程:1.pcap抓包得到受害者ip      2. 使用raw socket來手動修改ip、icmp里面的內容     3.開始發包,攻擊受害者

 

 

四、TCP協議安全問題

這里說明一下校驗和的一些內容:TCP的校驗和計算和IP頭部的校驗和計算方法是一致的,但是覆蓋的數據范圍不一樣。TCP校驗和覆蓋TCP首部和TCP數據,而IP首部中的校驗和只覆蓋IP的頭部。TCP的校驗和是必需的,而UDP的校驗和是可選的。TCP和UDP計算校驗和時,都要加上一個12字節的偽首部。偽首部包含:源IP地址、目的IP地址、保留字節(置0)、傳輸層協議號(TCP是6)、TCP報文長度(報頭+數據)。偽首部是為了增加TCP校驗和的檢錯能力:如檢查TCP的源和目的IP地址、傳輸層協議等。

1)什么是SYN flooding攻擊?效果是什么?如何防止?

A:攻擊者

B:被攻擊服務器

C:其他訪問者

首先,B開放一個端口,進行偵聽。A構造大量的TCP的SYN包發給B。

B一旦接收到SYN包就需要為即將建立的TCP連接分配TCB(Transmission Control Block),並進入半連接狀態。由於B最多可開啟的半開連接個數是一定的,受內存限制,當半開連接的個數過多,就會消耗掉可用的內存,使得新的正常的連接請求不能被處理。此時C對B進行訪問,建立TCP連接的請求就不能被正常處理。

效果:Dos攻擊--占用資源(內存、CPU、帶寬),deny of service,拒絕正常的服務。(SYN flooding可以以小博大)

防止:

1. SYN Cookie:在(第三握)ACK到達之前不分配任何資源

SYN Cookie關鍵在於:如何在不分配資源的同時,能夠識別是否是一個完整的TCP三次握手。 SYN cookie精心構建初始序列號:t、m、s來驗證。

2. SYNCache:四元組<源ip,源port,目的ip,目的port>,那么可以在接收到SYN包時,僅僅分配有限的空間,來維持其后可能需要的信息,而不是分配整個的TCP控制塊。到第三步才分配。

 

2)端口掃描的原理是什么?

nmap的工作原理:首先嘗試與一個個的端口連接

  • 沒有任何回復是被過濾了:filtered
  • 收到 SYN+ACK 就是開着的:open
  • 收到 RST 就是關閉的:close

 

3)nmap -sS和nmap -sT的區別是什么?

sS:發SYN包,無連接發RST(不建立連接、無痕跡;但需要root權限 =》最常用

nmap -sS:向目標主機發送TCP的SYN包,

當目標主機返回SYN/ACK包的時候,直接發送RST包。

不與目標主機建立完整的TCP連接。可以不留下掃描痕跡,但需要特殊權限。

 

sT:連接后發RST包  (建立連接、不隱蔽 =》不推薦使用)

nmap -sT:與目標主機建立完整的TCP連接后

再向目標主機發送RST包。不需要特殊權限,但是會留下掃描痕跡。

 

4)nmap -sA掃描的原理是什么?

sA:發ACK包

ACK數據包不會啟動會話建立,所以比較隱蔽;同時,因為ACK數據包不會單獨出現。

所以,對於端口,不管是開放的還是關閉的,如果收到一個不請自來的ACK數據包,都會發一個RST包。(只能判斷是否被過濾)

 

5)nmap idle掃描的原理是什么?

A:攻擊者

B:Zombie主機

C:目標主機

首先A先向B發送SYN/ACK包,然后B返回一個RST包,並記錄該包的IPID。

然后A冒充B向C發送SYN包。如果C的端口開放,則返回SYN/ACK包,B收到后會回復一個RST包,並且IPID+1。如果C的端口不開放,則直接返回RST。

之后A再向B發送一個SYN/ACK包,查看B返回的IPID的值,如果IPID的值增加了2,則可知C的端口開放。

idle無法區分關閉和被過濾的情況。


知識點:

  • 如果沒有發送SYN情況下,收到SYN|ACK包(不請自來),那么會回復RST。
  • 一個不請自來的RST,會被忽略。
  • 每個IP包都有Identifier(IPID),用於標識屬於同一數據包的所有IP碎片
  • 每發一個數據包,大部分操作系統簡單地進行:Identifier+1
  • 因此,從Identifier可以知道,主機在上一次發包后又發了幾個數據包

利用網絡里空閑的Zombie僵屍主機:

攻擊者idle掃描:

通過IPID的值判斷,目標主機端口狀態:

  • 如果IPID+1: 關閉 or 過濾     +1 就是A又去探測了一次 所以加了1
  • 如果IPID+2: 開              +2是除了A探測,又加了一個B回復C的RST

 

 

五、防火牆

防火牆分為三類:1. 包過濾防火牆(packet filter);2. 應用層網關代理(Application level Gateway)3. 狀態防火牆(stateful firewall)。

包過濾防火牆也可以成為無狀態防火牆,靜態防火牆。最核心的五元素就是源地址、目標地址、協議、源端口、目標端口。優點:實現簡單,規則也簡單,所以包過濾防火牆的處理速度快,並且易於配置。缺點:難以處理分片【IP碎片攻擊】; 不支持某些復雜的協議;不能防止應用層等惡意攻擊(原因很簡單,因為它根本不識別應用層的數據)。

 

1)iptables是狀態防火牆。狀態防火牆相比於包過濾防火牆的優點是什么?

  • 包過濾防火牆(packet filter):無狀態、靜態。易於設置、處理速度快;

缺點:無法分析上下文,難以處理分片【IP碎片攻擊】,不支持某些復雜的協議,不能防止應用層等惡意攻擊。

  • 狀態防火牆。優點為:建立連接狀態表,結合上下文狀態進行過濾,可以實現較好的過濾效果

在同一個會話中,五元組不會變化;但是各種狀態標識(SYN、SYN+ACK以及ACK)、分片(FO)等都是可以變化的。

 

2)NAT的作用是什么?

NAT:網絡地址轉換。

一種把內部私有網絡地址(IP地址)翻譯成合法網絡IP地址的技術。在一定程度上,能夠有效的解決公網IP地址不足的問題

  • 內網主機向外發出數據包時,NAT服務負責將數據包的源IP地址改成公網IP地址(SNAT);  S->Source 發包時:轉換源地址
  • 當外網對內網主機的回復到達時,NAT服務將回復包的目的IP再改成內網IP地址(DNAT)。  D->Destination 收包時:轉換目的地址

 

3)sudo iptables –P INPUT DROP;

     iptables -A INPUT -p tcp --sport 80 -j ACCEPT;

     這兩條語句的作用是什么?

  • 第一句,將iptables的策略制定為:丟棄所有傳入的數據包。

  • 第二句,添加INPUT策略,允許tcp 源端口號 為80的數據包通過防火牆。==》允許HTTP包傳入

 

 

六、Rootkit

1)什么是rootkit?

黑客安裝后門backdoor,獲取長期root權限后,

便於之后回訪,安裝rootkit,隱藏蹤跡,收集信息,便於長期回訪以及獲得對其他系統的訪問權限。

rootkit一般和后門backdoor配合着使用,一前一后

(短暫的root權限+backdoor+rootkit==>長期的root權限)

 

2)LKM的好處是什么?

LKM: 可加載內核模塊(Loadable Kernel Module)

優點是動態加載:內核進行修改和擴展時,不需要重編譯內核和重啟系統。

( LKM 包含 entry 和 exit 函數,分別用於插入、刪除)

 

3)請描述系統調用劫持的過程。

首先,當進行一次系統調用的時候,會觸發軟中斷(INT $0x80)==》進入內核的系統調用處理程序。

然后在系統調用處理程序的代碼中尋找到sys_call_table的地址。

接下來,根據系統調用表sys_call_table地址 和 eax中存放的系統調用號,

找到真正的 系統調用例程的地址

將其替換為 攻擊者的 系統調用處理函數地址。

 

 

4)請解釋,為何Unix可以做到一切皆文件?

虛擬文件系統(VFS)

  • 向上,對應用層 (的System Call) 提供一個標准的文件操作接口 (如read/write);
  • 對下,對文件系統提供一個標准的接口,以便其他操作系統的文件系統可以方便的移植到Linux上;

VFS內部則通過一系列高效的管理機制,比如inode cache, dentry cache 以及文件系統的預讀等技術,使得底層文件系統不需沉溺到復雜的內核操作,即可獲得高性能;此外VFS把一些復雜的操作盡量抽象到VFS內部,使得底層文件系統實現更簡單。

Linux中,一切皆文件。現在一般使用 Ext4 文件系統。

FAT(File Allocation Table文件分配表):FAT占用內存過多,難以管理較大的硬盤存儲。

 

 

七、緩沖區溢出

緩沖區:分配一段有限大小的內存空間

緩沖區溢出:從緩沖區 讀/寫 的數據超出了緩沖區可以容納的范圍。

 

1)什么是返回地址?

從子程序返回后,主程序繼續執行的指令地址稱為“返回地址”。

返回地址就是主程序中CALL指令后面一條指令的地址。函數的返回地址,也就是函數調用語句的下一條語句的地址。

 

2)匯編語言中,call指令的作用是什么?

轉移到調用的程序。

call + 調用函數的地址。

當執行調用(call)時,堆棧指針esp 遞減4個字節(32位),

並且調用后的指令地址(返回地址)被寫入現在由esp引用的存儲器位置,

換句話說,返回地址被壓入棧

然后將 指令指針eip 設置指定為要調用的操作數的地址,並從該地址繼續執行。

 

ret恰恰相反。簡單的ret不會占用任何操作數。

處理器首先從esp中包含的內存地址中讀取值,然后將esp增加4個字節,它會從堆棧中彈出返回地址。

eip設置為此值,並從該地址繼續執行。

 

3)請描述當函數調用發生時,進程地址空間中棧幀的變化。

首先,把函數調用的參數壓棧,然后cs、eip(返回地址)壓棧,

ebp(棧底)壓棧,接下來,更新ebp的值為esp的值(棧對齊),

將esp減少一個特定的值(與調用函數內部申請空間相關),為調用函數獲取一定的棧空間。

 

4)如何防止緩沖區溢出攻擊?  [本章重點]

  1. 編譯器進行了棧保護:canary保護,和防止棧運行。

  2. 棧起始地址隨機化,不同次運行同一個程序時,棧的起始位置都不一樣。(防止猜測 ShellCode 的入口地址

 

 


 

 

 


 

其他一些內容:

幾種典型攻擊(可以自己演示的):

1.1 netwox 80 使用ARP攻擊,阻止局域網內系統正常聯網

1.2 netwox 86 通過ICMP重定向,成為受害者、網關之間的中間人

1.3 netwox 76 TCP里面的SYN Flooding,Dos攻擊。

2. 在他人的系統上裝上后門backdoor(用於長期控制root權限);通常和rootkit配套使用,rootkit負責消除痕跡

3. stackoverflow 匯編代碼...

 

常用網絡相關Linux命令:

ping 發送ICMP請求

  • ping www.baidu.com:測試能否正常聯網
  • ping 192.168.3.33(本機gateway網關)
  • ping localhost:測試系統協議棧

ifconfig 配置網絡接口

  • 查看IP號、網卡等信息  ifconfig
  • 啟動 網卡(硬件,用於朝外發包)  sudo ifconfig ens33 up

netwox 發包工具

  • 80 ARP攻擊局域網
  • 86 ICMP重定向
  • 76 TCP里SYN Flooding

traceroute 追蹤路由信息(一般最多30跳)類似於 Windows系統-cmd中的tracert命令

nslookup  查看域名對應的IP地址,類似於DNS服務    例子:nslookup www.baidu.com

whois  查看IP屬於哪個組織。 例子:whois 219.219.220.1

netstat 顯示網絡狀態:網絡連接、路由表。。   例子:netstat -ant  查看tcp路由表、連接狀態等

tcpdump 網絡抓包工具。   例子:sudo tcpdump -i ens33 -c 20      其中i后面跟接口,c 20表示抓前20個包(packets)

  應用軟件wireshark 可用於抓包

netcat  用於TCP/UDP中讀寫數據:文件傳輸、即時通訊  (網絡工具中的瑞士軍刀)

  • 查看某IP的端口開放狀態:例子:查看百度網站的80端口(HTTP)    nc -v www.baidu.com 80     顯示:連接成功
  • 查看端口段:例子:nc -v localhost 20-30   同時查看20-30這11個端口
  • 局域網內 群聊:例子:001主機: nc -l 192.168.3.34 80       002主機:nc 192.168.3.34 80    然后就可以聊天了。。

nmap 用於端口掃描(TCP安全相關)

ssh 遠程連接

 

Mitnick米特尼克聖誕節攻擊

3個對象說明:

Target是黑客想要的文件,

X-terminal 與Target有連接(互相信任),

Server(X-terminal的服務器)與X-terminal 有TCP信任連接

 

攻擊鏈條: Target的訪問 <---> X-terminal <---> Server

攻擊思路:訪問 Target文件(最終目標)

--->劫持X-terminal與Target的連接

--->獲得X-terminal的root權限,並加載內核STREAMS模塊

---> 遠程修改X-terminal的.rhosts文件(賬戶信任關系)

---> 以X-terminal信任的Server,建立TCP連接,在TCP中傳遞命令

  • 對X-terminal:IP源地址欺騙和TCP序列號預測;
  • 對Server:Dos攻擊,使之不能(對意外SYN-ACK)發出RST; 

 

1.1 SYN、ACK和RST分別在什么時候使用?

SYN:A向B請求建立TCP連接的時候使用。

ACK:B同意與A的TCP連接請求的時候使用。或者A收到B的SYN/ACK報文時,第三次握手的時候。

RST:A-SYN->B,而B不同意與A建立TCP連接的時候使用,B-RST->A。或者,B-SYN/ACK->A,而A拒絕的時候使用,A-RST->B。或者,A-ACK->B(非正常連接),則B-RST->A。

1.2 攻擊為什么要選擇在聖誕節?

該攻擊程序注意到連續的兩個數據包之間,初始序列號增長了128,000。因此,該攻擊程序破解了序列號生成規則(等差序列)。

下村的機器必須處於閑置狀態,攻擊才能進行成功。不然的話,其他的連接將改變數據包的初始序列號,並使其更難以預測。這就是黑客選擇在聖誕節攻擊的原因。

(簡版:因為聖誕節的時候放假了,不會對B進行頻繁的訪問,以便預測B生成的TCP序列號。)

 

1.3 進行SYN flooding以實現DoS的可信server的端口號是多少?為什么要選擇這個端口?能不能換用一個其他端口?

0~1024。因為攻擊者是是冒充工作站的服務器進行與server的訪問的。客戶端的端口號一般大於1024,而服務器的端口號則在0~1024之間。

 

1.4 在成功添加后門后,攻擊者為何要發送RST釋放可信Server中的TCP連接?

清除攻擊痕跡,使得C能夠被正常訪問,並不保留連接記錄。

 

 

 

 

drwxrwxr-x  d表示directory,文件夾默認權限775

-rw-rw-r--  -表示是文件,文件默認權限664

 /usr/bin/passwd:4755==》紅字,無法訪問(此時eid不等於rid) 

           chmod改成 755 ==》綠字,可以訪問

47==>rws    7==>rwx

 引入了真實UID(real UID)、有效UID(effective UID)以及 保存的UID(saved set-user-ID)的概念。

  1. rid實際用戶ID和實際組ID標示我們實際上是誰;這兩個字段是在登錄時讀取口令文件中的登錄項。一般情況下,在一個會話期間,實際用戶和實際組用戶不會改變;但超級用戶的進程可能改變它們。
  2. eid有效用戶ID,有效組ID以及附加組ID決定了文件訪問權限

 

 


《信息安全》另外3篇筆記:

信息安全 學習筆記(1)——常用攻擊、網絡命令、ARP安全、IP安全

信息安全 學習筆記(2)——防火牆(Netfilter/ IPtables)

信息安全 學習筆記(3)—— 后門(Backdoor+rootkit)

 

參考:

信息安全課程18:復習    https://zhuanlan.zhihu.com/p/62970150

信息安全復習    https://zhuanlan.zhihu.com/p/63614262


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM