Hi guys,
Như các thông báo đã được đăng trên fanpage của hackemall, trong chuỗi các topic của HackerDEX, hôm nay mình xin được chia sẻ con đường mình đã đi cũng như kinh nghiệm của mình về một mảng mà đa số các script kiddies / hacker / gosu … đều đã từng trải qua: Web Application Security (WebSec). Hi vọng roadmap này sẽ giúp ít cho các bạn đã và đang mới bắt đầu hay đang gặp khó khăn, stuck, betak đối với mảng web, giúp cho các bạn tiết kiệm về thời gian, có một cái nhìn tổng quan, cụ thể về mảng này. Okay let’s go.
Trong article này, mình sẽ hệ thống nội dung theo 3 levels từ dễ cho tới khó đối với mảng web.
Mình tiếp xúc với web security cũng như các cuộc thi Capture The Flag (CTF) ngay từ trước những ngày đầu nhập học của đời sinh viên (2014), chinh chiến, vỡ mồm cũng nhiều :D, cũng đạt được một vài thành tựu đối với các giải CTF trong nước lẫn nước ngoài. Lúc đầu mình chơi tất cả các mảng, sau này mình đi sâu và sâu hơn vào mảng web. Mình sẽ hệ thống lại những gì mình đã học, luyện khi chân ướt chân ráo bước vào thế giới World Wide Web.
Đối với tất cả những bạn đã từng tiếp xúc với WebSec khi chơi CTF hoặc vọc vạch một trang web nào đó, cảm giác sẽ rất dễ chịu, bạn cảm thấy rằng bạn có thể mò tới mọi thứ, mọi ngóc ngách của trang web đó. Chính vì thế, đây là mảng dễ chơi nhất và ai cũng đều có thể trở thành :hackerman:
Tuy nhiên không có gì là dễ dàng, mảng web tuy dễ tiếp cận nhưng theo trải nghiệm của mình từ trước đến nay, đa số những bạn được gọi là “đam mê” hack web đều sẽ dừng lại ở một mức nào đó và không đi xa, đi sâu hơn trên con đường này. Kiến trúc của mảng này nó như một cái phễu ngược , càng đi sâu càng khó và rất rất đa dạng, vì thế nhiều người sẽ bỏ cuộc khi bị stuck, betak gaming, mất phương hướng. Tuy nhiên:
Nhiều bạn cũng đã từng hỏi mình học web là học gì?, tiếp cận ban đầu với websec như thế nào?, em là newbie em muốn học HTTP Desync Attacks, Web Cache Poisoning … anh chỉ em được không?.
Mình sẽ hệ thống lại roadmap như sau:
1. Học lập trình: Nghe có vẻ thiên hơn về Software Engineer, nhưng không, để bắt đầu trên con đường này thì điều đầu tiên và tiên quyết là bạn phải biết lập trình. Không một hacker thực thụ nào mà không biết lập trình, ít nhất là từ phải mức độ medium trở lên. Bạn không cần phải biết tất cả các ngôn ngữ một cách chuyên sâu như các Software Engineer thực thụ nhưng về cơ bản, bạn phải có kiến thức nền tảng về khá nhiều các ngôn ngữ (vì thế giới web rất rộng lớn và đa dạng). Do đó khi đã có kiến thức nền tảng về lập trình, bạn sẽ đi rất nhanh và rất xa. Hiện tại thế giới web được xây dựng trên rất nhiều nền tảng, ngôn ngữ rất đa dạng, bạn biết được càng nhiều ngôn ngữ lập trình thì điều đó lại càng có lợi cho bạn về sau này, không bổ ngang thì cũng bổ dọc (mình đảm bảo, nếu thất nghiệp thì đi dev web dạo cũng được không sao ).
Mình list một số ngôn ngữ lập trình thông dụng cũng như đang là xương sống của các ứng dụng web ngày nay, bạn có thể tìm hiểu và học nó một cách chi tiết: PHP, Java, JavaScript (và các họ của nó: NodeJS, ReactJS, AngularJS …), C/C++, C# (for .NET application), Golang, LUA, Ruby. Bạn phải có khả năng lập trình, đọc hiểu, debug … từ mức độ medium trở lên của các ngôn ngữ mà mình vừa liệt kê bên trên, bạn đã hoàn thành được bước đầu khi đặt chân vào WebSec. Và cuối cùng, bạn nên thông thạo một ngôn ngữ để thực hiện viết các exploit script một cách nhanh và chính xác nhất. Mình khuyến khích bạn nên học Python theo một cách nghiêm túc nhất. (Learn Python the Hard Way)
2. Học Unix / Linux: Mặc dù mình là một fanboy của Windows nhưng mình đảm bảo với bạn rằng, Linux nó sẽ giúp ít cho bạn rất nhiều khi bạn theo đuổi security nói chung và WebSec nói riêng. Bạn quá mệt mỏi với việc copy / paste / edit 1 GB, 10 GB, 100 GB … data trên windows, Linux nó sẽ xử lý các vấn đề đó với chỉ 1 dòng bash script. Hãy học Linux ngay từ ban đầu.
3. Học các loại lỗ hổng bảo mật của ứng dụng web:
Lỗ hổng bảo mật web thật sự rất đa dạng và phong phú, càng ngày càng có quá nhiều lỗ hổng mới, các new hacking vector, trending …
Về cơ bản, các ứng dụng web hiện tại sẽ tồn tại các lỗ hổng bảo mật được chia thành 2 dạng chính như sau:
Server-side vulnerability và Client-side vulnerability.
Server-side vulnerability: Như tên gọi của nó, đây là các lỗ hổng ảnh hưởng trực tiếp đến phía server và thông thường các loại lỗ hổng ở phần này luôn luôn có impact nghiêm trọng / cao. Bạn thử nghĩ bạn cầm exploit 1 lỗ hổng bảo mật chưa được công bố (0-day) Unauthenticated Remote Code Execution (RCE) của WordPress (khoảng 60% trên tổng số websites trên thế giới đang sử dụng WordPress) phiên bản mới nhất, bạn sẽ làm gì đầu tiên?
Các loại lỗ hổng thông dụng thuộc mục này như: RCE, Injection (Command Injection, SQL Injection … ), SSRF, XXE, Insecure Deserialization …
Client-side vulnerability: Tương tự, đây là các lỗ hổng ảnh hưởng trực tiếp đến phía client, nói đơn giản cho dễ hiểu, bạn click vào đây thì nó đã ảnh hưởng trực tiếp tới trình duyệt bạn đang đọc bài viết này. Các loại lỗ hổng ở phần sẽ có impact tùy thuộc vào việc bạn khai thác được đến đâu và thông tin bạn có được sau khi khai thác thành công. Và tất nhiên, một yếu tố tạo nên tên gọi cũng như impact của lỗ hổng này là sự tương tác của người dùng (victim), hãy luôn nhớ điều đó để phân biệt, tránh bị nhầm lẫn.
Các loại lỗ hổng thông dụng thuộc mục này như: XSS (Cross-site scripting), CSRF (Cross Site Request Forgery), XS-Leaks (XS-Search), JSONP Leaks, CORS Misconfigurations …
Từ những thông tin mình kể trên, bạn hãy tìm hiểu và học các loại lỗ hổng bảo mật của ứng dụng web, hiện tại OWASP các năm cũng đưa ra sự thống kê về top 10 các loại lỗ hổng bảo mật theo impact giảm dần. Mình nghĩ đừng nên coi thường hay bỏ qua bất kỳ loại lỗ hổng nào, mỗi loại lỗ hổng đều có vẻ đẹp riêng về bản chất cũng như cách thức exploit của nó.
Điều quan trọng nhất khi bạn học và khai thác các loại lỗ hổng bảo mật của ứng dụng web, mình khuyên là bạn nên tạo ra loại lỗ hổng đó trước (bằng lập trình), sau đó tiến hành khai thác nó. Đây là cách học mình cảm thấy hiệu quả nhất từ trước đến nay.
4. Học cách sử dụng các công cụ một cách đúng đắn: Đừng trở thành script kiddie. Công cụ nó chỉ giúp ích cho bạn khai thác thông tin về đối tượng, exploit một cách nhanh chóng nhất. Khi sử dụng bất kỳ công cụ nào, bạn đều phải biết được nguyên lý hoạt động của nó. Một vài công cụ thông dụng dành cho các bạn ở level này như: Burp Suite, SQLMap, Python script, các add-ons hỗ trợ (hackbar, wappalyzer, foxyproxy …).
5. Các kiến thức nền tảng khác: Tất nhiên khi bạn khai thác các lỗ hổng ứng dụng web, bạn không cần phải return to libc hay leaking a heap address. Tuy nhiên, kiến thức nền tảng về tất cả các lĩnh vực trong security rất quan trọng và bạn phải hiểu được cơ bản đối với các mảng khác. Bạn phải có kiến thức tổng quát về system, database, network, crypto, RE thậm chí là pwnable / exploit, nó sẽ giúp ích cho bạn ít nhất là ngay từ ban đầu và giúp bạn đi được xa hơn nếu muốn theo đuổi web hacking. Mình ví dụ đơn giản: bạn được giao 1 task để nghiên cứu về một target sử dụng webassembly, ngoài web ra, bạn không biết thêm gì cả, dẫn tới bạn lại phải học lại assembly, học RE blah blah lại từ đầu. Chán nản, betak, ragequit …
Sau khi trải qua beginner level một cách đúng đắn và hiệu quả nhất, mình đảm bảo là bạn đã khá đầy đủ lông cánh, lúc này bạn rất muốn sử dụng tất cả skills, kiến thức của bạn vừa học được để hành tẩu giang hồ .
Trăm hay không bằng tay quen, khi bạn cày càng nhiều, học càng nhiều bạn sẽ càng giỏi. Bạn luyện skill nhiều, tập debug, tập viết exploit … bạn sẽ càng thành thạo tất cả các kỹ năng, thao tác nhanh nhẹn và không bị vướng víu vì các issues nhỏ nhỏ. Điều này rất có ích, giúp bạn tiết kiệm được rất nhiều thời gian cũng như công sức.
1. CTF WarGame: Về CTF (Capture the Flag) thì đã có rất nhiều bài viết nói về, mình sẽ không đi sâu vào giải thích CTF là gì, bạn có thể tìm hiểu nó ở nhiều nguồn khác nhau. Về bản chất, mình cảm thấy CTF đơn thuần chỉ là phương pháp học và nó sẽ giúp bạn luyện tập các kiến thức đã học một cách nhanh nhất. Sau khi có được đầy đủ các kiến thức nền tảng, mình khuyến khích các bạn thực hành các skills đã học được trên nền tảng các CTF WarGame trước. Đây là các thử thách đã được dựng sẵn dựa trên các lỗ hổng ứng dụng web. Hiện nay có rất nhiều WarGame chất lượng, mình khuyến khích bạn luyện tập trên các WarGame sau: Root-Me, RingZer0CTF.
2. CTF Competitions: Tương tự như WarGame, nhưng CTF competition sẽ giới hạn trong một khoảng thời gian nhất định (24 tiếng – 48 tiếng) tùy thuộc vào độ khó của cuộc thi. Hãy chọn các giải CTF chất lượng để luyện tập cũng như tryhard (rating weight >= 25). Mình đã từng thức 48 tiếng liên tục chỉ để chơi CTF. Danh sách các giải CTF luôn được cập nhật tại CTFtime.
3. WebSec Laboratory: Nếu bạn không thích hoặc không hứng thú với CTF hoặc vì một lý do gì đó khiến bạn khó chịu khi giải các thử thách về CTF (betak, stuck …), không vấn đề gì, bạn hoàn toàn có thể dựng lại các lab về các lỗ hổng bảo mật web, tự vọc vạch, khai thác nó. Thay vì CTF, tác giả đã tạo sẵn challenge cho bạn, bạn chỉ việc chơi thôi, thì khi làm lab, bạn phải setup lại tất cả mọi thứ, từ network, config firewall, vhost, docker, setup env … Khi dựng lab, bạn sẽ có thêm kha khá skill về debug, troubleshooting, network, system, database, điều này sẽ rất có lợi cho bạn về giai đoạn sau, khi thực chiến trên các production thật sự. Hiện nay hackemall cũng đã có MAWC lab được mô phỏng dưới các dạng các thử thách CTF, bạn hoàn toàn có thể thử sức.
Nếu bạn vẫn không có thời gian dựng lab hay bận bịu vì các lý do nào đó, không sao mình vẫn còn plan cuối cùng. Hãy thử các lab sau: PentesterLab, Web Security Academy. Đây là hai anh lớn hiện nay về WebSec, mình khuyến khích bạn nên thử nó.
4. Audit / Secure Code Review: Về cơ bản, khi tiếp cận một vấn đề liên quan tới WebSec, bạn sẽ có được các thông tin của target đó được chia thành 3 loại như sau: Black box, White box và Gray box đúng như tên gọi của nó theo nghĩa bóng. Mình sẽ nói về White box trong context này.
Đối với White box, bạn sẽ có được tất cả thông tin về đối tượng đó, source code front-end, back-end. Mọi thứ đều tường minh và rõ ràng, khi chơi CTF cũng vậy, các bài mà tác giả cung cấp đầy đủ source code đều là các bài khá hay và hấp dẫn (theo ý kiến cá nhân). Khi bạn đọc source code, debug để giải quyết các vấn đề của một thử thách, kỹ năng về audit, secure code review của bạn sẽ tăng lên rất đáng kể. Sau này khi tiếp các các target thực tế, bạn sẽ không bị bỡ ngỡ hoặc bị ngợp dưới số lượng dòng code hoàn toàn lên đến hơn 4 triệu dòng (Magento Framework).
5. Mitigations: Khi bạn đã có được nhiều kiến thức về tấn công, lúc này mình khuyên bạn nên học các cách phòng thủ: Ứng dụng web hiện đang bị lỗ hổng bảo mật SQLi thì patch làm sao?, XSS thì patch sao?, SSRF thì patch sao? …
Việc biết được các biện pháp mitigation vừa giúp ích cho bạn rất nhiều trong việc nhận biết, phán đoán ứng dụng web hiện tại sẽ có khả năng tồn tại lỗ hổng bảo mật nào, cũng như có ích rất nhiều khi bạn thực hiện audit / secure code review.
6. Mobile Security: Nghe có vẻ khá lệch pha nhưng không, bạn hãy học thêm về mobile security. Về cơ bản theo mình thấy, khi bạn thực hiện vọc vạch, debug, exploit các ứng dụng về mobile trên iOS và android, thực ra ở phía back-end nó cũng sẽ gọi tới các web API, khi đó bài toán lại quay trở về khai thác ứng dụng web (tất nhiên là sau khi bạn đã vượt qua được các giai đoạn setup, debug, thiết lập env …). Về mobile security hiện tại đã có rất nhiều methodology, paper, roadmap trên internet. Hackemall hiện cũng đã có một series liên quan đến android mobile security, mình khuyến khích bạn nên tham khảo nếu muốn bước vào chân mảng này.
Khi tới level này, mình đoán chắc là bạn đã đi một con đường khá dài và đủ lâu, kiến thức cũng đã đầy đủ, kỹ năng ngày càng hoàn thiện. Tuy nhiên, kỹ thuật, xu hướng của WebSec rất đa dạng và mới mẻ, đòi hỏi bản thân luôn phải luôn trau dồi, học hỏi thêm.
1. Học, học nữa, học mãi: Hãy tìm hiểu rõ về các kỹ thuật mới, xu hướng hiện tại: HTTP Desync Attacks, Web Cache Poisoning, XS-Leaks … hay các attack đang là trending ngay tại thời điểm mình viết bài này: Insecure Deserialization trên Java và .NET.
Nhiều bạn hỏi mình là mình học mấy thứ mới mới này ở đâu, thì mình trả lời luôn là mình học nó từ các WebSec warriors khác trên . Mình hay follow các WebSec warriors khác trên đây, nếu bạn thực sự nghiêm túc trên con đường này, mình khuyên thật hãy sử dụng twitter. Dont follow your dream, follow my: https://twitter.com/ducnt_
2. Tools: Tới level này, bạn phải biết cách debug, viết tools, viết plugin, add-ons cho các công cụ (đừng chế lại bánh xe) như: Nmap (LUA NSE script), Burp Suite Plugin (Python / Java scripts), SQLMap Tamper Data Script …
3. Research: Tìm 0-day, CVE (của các vendor nổi tiếng và CVE có giá trị cao, đừng tìm các useless CVE hoặc CVE của các unknown vendor 🙂 ). Dựng lại các 1-day exploit.
Hãy luôn coi trọng việc research đối với WebSec. Thành tựu của Pentest / Bug bounty đều là kết quả đến từ việc research.
4. Bug bounty hunter: Hãy chơi bug bounty và kiếm tiền từ nó, nó sẽ giúp bạn có thêm thu nhập cũng như rèn luyện các kỹ năng thực chiến. Hiện nay có rất nhiều sàn bug bounty, mình khuyến khích các bạn nên chơi các sàn quốc tế vì sự chuyên nghiệp như: HackerOne, Bugcrowd.
Đối với các sàn ở Việt Nam thì mình không tham gia, tuy nhiên tại hội thảo Hack In The Box 2020 LockDown (HITB) vừa diễn ra, một sàn bug bounty được thành lập và duy trì bởi các anh trong VNSecurity hoàn toàn mới mẻ và khác biệt với các sàn khác vừa được ra mắt: Bug Rank.
Đây là một open source và non-profit bug bounty platform, hoàn toàn hướng đến community. Mình khuyến khích các bạn nên tham gia, trải nghiệm.
5. Security Conferences: Bạn hãy tham gia hoặc submit các paper, research đối với các security conferences trong nước cũng như nước ngoài, bạn sẽ có cơ hội gặp gỡ với nhiều người cùng đam mê sở thích. Bạn sẽ học hỏi được khá nhiều điều thú vị đến từ những người đi trước.
6. Đạo đức nghề nghiệp (optional): Đây là phần cuối và cũng là vài lời mình muốn nhắn nhủ tới các bạn trẻ hiện tại đang trên con đường trở thành WebSec warrior. Khi bạn phát hiện thấy lỗi, cho dù ở mức độ critical hay ở mức độ medium, có impact cụ thể, hãy report nó cho vendor / company / organization … có liên quan đến lỗ hổng đó.
select * from credit_cards; drop database customers; || rm -rf /
không được khuyến khích. Hãy cân nhắc, bạn vừa có khả năng được bug bounty, HoF của tổ chức đó cũng như nhận được sự respect của các WebSec warriors khác khi thông báo về lỗ hổng đó. Đừng làm điều dại dột.
Cơ hội nghề nghiệp: WebSec warriors hoàn toàn có thể trở thành: Pentester / Red Teamer / Bug bounty hunter / Researcher tùy thuộc vào sở thích của mỗi người. Chi tiết roadmap của các lĩnh vực trên sẽ được ra mắt vào thời gian tới trong khuôn khổ các series HackerDEX.
Hi vọng qua bài viết này, nó sẽ giúp ích cũng như vẽ ra được con đường cụ thể cho các bạn đang muốn trở thành WebSec warrior. Hiện nay cộng đồng security ở Việt Nam đang phát triển khá mạnh mẽ, nếu bạn đang là sinh viên, bạn hoàn toàn có thể tham gia group VNSEC Foundation trên telegram để tìm hiểu cũng như nắm bắt các cơ hội trong lĩnh vực security dành cho sinh viên.
Cảm ơn vì đã đọc, hẹn gặp lại các bạn trong các series tiếp theo.
~Cheers,
ducnt
Anh cho em xin vài từ khóa để tìm tài liệu build WebSec Laboratory như mô tả của anh với ạ. Em từng cài qua một vài dịch vụ trên linux, đọc xong bài của anh em cũng có tìm thử mà hầu hết là vài bài dựng lab rất cơ bản ạ.
Hi Văn Hoàng,
Em có thể search các keyword như: websecurity lab, cve lab, ctf docker image …
Về chỗ để search thì em có thể search trên github cho nhanh nhé.
~Cheers,
ducnt
Dạ. em cảm ơn anh ạ.
Hi bạn. Bạn có thể cho mình biết, với một target cụ thể thì các quy trình và công cụ bạn sử dụng không (VD như phần recon gồm những bước nào, công cụ gì?)
Anh có thể chia sẻ thêm cách học lập trình của anh được không ạ ? Với lại mức độ lập trình medium mà anh đề cập tới anh có thể nói rõ hơn không ạ ?
Cảm ơn anh 😀
Anh chia sẻ thêm về cách anh học lập trình web và resources tham khảo được không ạ ?