Cách cài đặt và sử dụng Radamsa để Fuzz kiểm tra các chương trình và dịch vụ mạng trên Ubuntu 18.04
Các mối đe dọa bảo mật liên tục trở nên tinh vi hơn, vì vậy các nhà phát triển và administrator hệ thống cần phải có phương pháp chủ động trong việc bảo vệ và kiểm tra tính bảo mật của các ứng dụng của họ.Phương pháp phổ biến để kiểm tra tính bảo mật của các ứng dụng client hoặc dịch vụ mạng là làm mờ , liên quan đến việc gửi liên tục dữ liệu không hợp lệ hoặc không đúng định dạng đến ứng dụng và phân tích phản hồi của ứng dụng. Điều này rất hữu ích để giúp kiểm tra xem ứng dụng có khả năng phục hồi và mạnh mẽ như thế nào đối với đầu vào không mong muốn, có thể bao gồm dữ liệu bị hỏng hoặc các cuộc tấn công thực tế.
Radamsa là một công cụ fuzzing open-souce có thể tạo các trường hợp thử nghiệm dựa trên dữ liệu đầu vào do user chỉ định. Radamsa hoàn toàn có thể viết kịch bản và cho đến nay đã thành công trong việc tìm kiếm lỗ hổng trong các ứng dụng thế giới thực, chẳng hạn như Gzip.
Trong hướng dẫn này, bạn sẽ cài đặt và sử dụng Radamsa để kiểm tra dòng lệnh và các ứng dụng dựa trên mạng bằng cách sử dụng các trường hợp kiểm tra của bạn .
Cảnh báo: Radamsa là một công cụ kiểm tra thâm nhập có thể cho phép bạn xác định các lỗ hổng hoặc điểm yếu trong một số hệ thống hoặc ứng dụng nhất định. Bạn không được sử dụng các lỗ hổng bảo mật được tìm thấy với Radamsa cho bất kỳ hình thức hành vi liều lĩnh, gây hại hoặc khai thác ác ý nào. Các lỗ hổng phải được báo cáo về mặt đạo đức cho người duy trì ứng dụng bị ảnh hưởng và không được tiết lộ công khai mà không có sự cho phép rõ ràng.
Yêu cầu
Trước khi bắt đầu hướng dẫn này, bạn cần những thứ sau:
- Một server Ubuntu 18.04 được cài đặt bằng cách thực hiện theo Cài đặt server ban đầu với Ubuntu 18.04 , bao gồm một user không phải root có quyền sudo và firewall được bật để chặn các cổng không cần thiết.
- Một dòng lệnh hoặc ứng dụng dựa trên mạng mà bạn muốn kiểm tra, ví dụ như Gzip, Tcpdump, Bind, Apache, jq hoặc bất kỳ ứng dụng nào khác mà bạn chọn. Để làm ví dụ cho mục đích của hướng dẫn này, ta sẽ sử dụng jq .
Cảnh báo: Radamsa có thể khiến các ứng dụng hoặc hệ thống chạy không ổn định hoặc gặp sự cố, vì vậy chỉ chạy Radamsa trong môi trường mà bạn đã chuẩn bị cho việc này, chẳng hạn như server chuyên dụng. Cũng hãy đảm bảo bạn có sự cho phép bằng text rõ ràng từ chủ sở hữu của hệ thống trước khi tiến hành kiểm tra lông tơ đối với nó.
Khi đã sẵn sàng những thứ này, hãy đăng nhập vào server của bạn với quyền là user không phải root của bạn để bắt đầu.
Bước 1 - Cài đặt Radamsa
Đầu tiên, bạn sẽ download và biên dịch Radamsa để bắt đầu sử dụng nó trên hệ thống của bạn . Mã nguồn Radamsa có sẵn trong kho lưu trữ chính thức trên GitLab .
Bắt đầu bằng cách cập nhật index gói local để phản ánh mọi thay đổi ngược dòng mới:
- sudo apt update
Sau đó, cài đặt các gói gcc
, git
, make
và wget
cần thiết để biên dịch mã nguồn thành file binary thực thi:
- sudo apt install gcc git make wget
Sau khi xác nhận cài đặt, apt
sẽ download và cài đặt các gói được chỉ định và tất cả các gói phụ thuộc của chúng.
Tiếp theo, bạn sẽ download bản sao mã nguồn cho Radamsa bằng cách sao chép mã nguồn từ repository trên GitLab:
- git clone https://gitlab.com/akihe/radamsa.git
Thao tác này sẽ tạo một folder tên là radamsa
, chứa mã nguồn của ứng dụng. Di chuyển vào folder để bắt đầu biên dịch mã:
- cd radamsa
Tiếp theo, bạn có thể bắt đầu quá trình biên dịch bằng make
:
- make
Cuối cùng, bạn có thể cài đặt file binary Radamsa đã biên dịch vào $PATH
:
- sudo make install
Sau khi hoàn tất, bạn có thể kiểm tra version đã cài đặt đảm bảo rằng mọi thứ đang hoạt động:
- radamsa --version
Đầu ra của bạn sẽ trông giống như sau:
OutputRadamsa 0.6
Nếu bạn thấy radamsa: command not found
, hãy kiểm tra kỹ đảm bảo rằng tất cả các phần phụ thuộc đã được cài đặt và không có lỗi nào trong quá trình biên dịch.
Đến đây bạn đã cài đặt Radamsa, bạn có thể bắt đầu tạo một số trường hợp thử nghiệm mẫu để hiểu cách hoạt động của Radamsa và nó được dùng để làm gì.
Bước 2 - Tạo các trường hợp kiểm tra Fuzzing
Bây giờ Radamsa đã được cài đặt, bạn có thể sử dụng nó để tạo một số trường hợp thử nghiệm mờ.
Trường hợp thử nghiệm là một phần dữ liệu sẽ được sử dụng làm đầu vào cho chương trình bạn đang thử nghiệm. Ví dụ: nếu bạn đang kiểm tra một chương trình lưu trữ như Gzip, một trường hợp thử nghiệm có thể là một repository file mà bạn đang cố gắng extract .
Lưu ý: Radamsa sẽ thao tác dữ liệu đầu vào theo nhiều cách bất ngờ khác nhau, bao gồm lặp lại cực độ, lật bit , chèn ký tự điều khiển, v.v. Điều này có thể khiến phiên terminal của bạn bị hỏng hoặc không ổn định, vì vậy hãy lưu ý điều này trước khi tiếp tục.
Đầu tiên, chuyển một đoạn văn bản đơn giản cho Radamsa để xem điều gì sẽ xảy ra:
- echo "Hello, world!" | radamsa
Thao tác này sẽ thao tác (hoặc làm mờ) dữ liệu đã nhập và xuất ra một trường hợp thử nghiệm, ví dụ:
OutputHello,, world!
Trong trường hợp này, Radamsa đã thêm một dấu phẩy bổ sung giữa Hello
và world
. Đây có vẻ không phải là một thay đổi đáng kể, nhưng trong một số ứng dụng, điều này có thể khiến dữ liệu bị diễn giải không chính xác.
Hãy thử lại bằng cách chạy lệnh tương tự. Bạn sẽ thấy kết quả khác nhau:
OutputHello, '''''''wor'd!
Lần này, nhiều dấu ngoặc kép ( '
) đã được chèn vào chuỗi, bao gồm một dấu ngoặc kép overrides chữ l
trong world
. Trường hợp thử nghiệm cụ thể này có nhiều khả năng dẫn đến sự cố cho ứng dụng, vì dấu nháy đơn / kép thường được sử dụng để tách các phần dữ liệu khác nhau trong danh sách.
Hãy thử :
OutputHello, $+$PATH\u0000`xcalc`world!
Trong trường hợp này, Radamsa đã chèn một chuỗi chèn shell , sẽ hữu ích để kiểm tra các lỗ hổng chèn lệnh trong ứng dụng mà bạn đang thử nghiệm.
Bạn đã sử dụng Radamsa để làm mờ một chuỗi đầu vào và tạo ra một loạt các trường hợp thử nghiệm. Tiếp theo, bạn sẽ sử dụng Radamsa để làm mờ một ứng dụng dòng lệnh.
Bước 3 - Làm mờ ứng dụng dòng lệnh
Trong bước này, bạn sẽ sử dụng Radamsa để làm mờ một ứng dụng dòng lệnh và báo cáo về sự cố nào xảy ra.
Kỹ thuật chính xác để làm mờ mỗi chương trình rất khác nhau và các phương pháp khác nhau sẽ hiệu quả nhất cho các chương trình khác nhau. Tuy nhiên, trong hướng dẫn này, ta sẽ sử dụng ví dụ về jq
, là một chương trình dòng lệnh để xử lý dữ liệu JSON.
Bạn có thể sử dụng bất kỳ chương trình tương tự nào khác miễn là nó tuân theo nguyên tắc chung là lấy một số dạng dữ liệu có cấu trúc hoặc phi cấu trúc, thực hiện điều gì đó với nó, rồi xuất ra kết quả. Ví dụ, ví dụ này cũng sẽ hoạt động với Gzip, Grep, bc, tr, v.v.
Nếu bạn chưa cài đặt jq
, bạn có thể cài đặt nó bằng apt
:
- sudo apt install jq
jq
bây giờ sẽ được cài đặt.
Để bắt đầu vui chơi, hãy tạo một file JSON mẫu mà bạn sẽ sử dụng làm đầu vào cho Radamsa:
- nano test.json
Sau đó, thêm dữ liệu JSON mẫu sau vào file :
{ "test": "test", "array": [ "item1: foo", "item2: bar" ] }
Bạn có thể phân tích cú pháp file này bằng jq
nếu bạn muốn kiểm tra xem cú pháp JSON có hợp lệ không:
- jq . test.json
Nếu JSON hợp lệ, jq
sẽ xuất file . Nếu không, nó sẽ hiển thị lỗi, bạn có thể sử dụng lỗi này để sửa cú pháp nếu cần.
Tiếp theo, làm mờ file JSON thử nghiệm bằng Radamsa và sau đó chuyển nó sang jq
. Điều này sẽ khiến jq
đọc trường hợp thử nghiệm bị thao túng / thao tác, thay vì dữ liệu JSON hợp lệ ban đầu:
- radamsa test.json | jq
Nếu Radamsa làm mờ dữ liệu JSON theo cách mà nó vẫn hợp lệ về mặt cú pháp, jq
sẽ xuất ra dữ liệu, nhưng với bất kỳ thay đổi nào mà Radamsa thực hiện với nó.
Ngoài ra, nếu Radamsa làm cho dữ liệu JSON trở nên không hợp lệ, jq
sẽ hiển thị một lỗi có liên quan. Ví dụ:
Outputparse error: Expected separator between values at line 5, column 16
Kết quả thay thế sẽ là jq
không thể xử lý chính xác dữ liệu bị mờ, khiến nó gặp sự cố hoặc hoạt động sai. Đây là những gì bạn thực sự đang tìm kiếm với fuzzing, vì điều này có thể là dấu hiệu của một lỗ hổng bảo mật như tràn cache hoặc chèn lệnh.
Để kiểm tra hiệu quả hơn các lỗ hổng như thế này, mộttập lệnh Bash được dùng để tự động hóa quá trình làm mờ, bao gồm việc tạo các trường hợp thử nghiệm, chuyển chúng đến chương trình mục tiêu và nắm bắt bất kỳ kết quả nào có liên quan.
Tạo một file có tên jq-fuzz.sh
:
- nano jq-fuzz.sh
Nội dung tập lệnh chính xác sẽ khác nhau tùy thuộc vào loại chương trình mà bạn đang sử dụng và dữ liệu đầu vào, nhưng trong trường hợp jq
và các chương trình tương tự khác, tập lệnh sau là đủ.
Sao chép tập lệnh vào file jq-fuzz.sh
của bạn:
#!/bin/bash while true; do radamsa test.json > input.txt jq . input.txt > /dev/null 2>&1 if [ $? -gt 127 ]; then cp input.txt crash-`date +s%.%N`.txt echo "Crash found!" fi done
Tập lệnh này chứa một while
để làm cho nội dung lặp đi lặp lại. Mỗi khi tập lệnh lặp lại, Radamsa sẽ tạo một trường hợp thử nghiệm dựa trên test.json
và lưu nó vào input.txt
.
Sau input.txt
trường hợp kiểm tra input.txt
sẽ được chạy qua jq
, với tất cả kết quả tiêu chuẩn và lỗi được chuyển hướng đến /dev/null
để tránh lấp đầy màn hình terminal .
Cuối cùng, giá trị thoát của jq
được kiểm tra. Nếu giá trị thoát lớn hơn 127
, đây là dấu hiệu của sự kết thúc nghiêm trọng (sự cố), sau đó dữ liệu đầu vào được lưu để xem xét vào một ngày sau đó trong một file có tên là sự crash-
theo sau là ngày hiện tại tính bằng Unix giây và nano giây.
Đánh dấu tập lệnh là có thể thực thi và đặt nó chạy để bắt đầu tự động kiểm tra mờ jq
:
- chmod +x jq-fuzz.sh
- ./jq-fuzz.sh
Bạn có thể phát hành CTRL+C
bất kỳ lúc nào để chấm dứt tập lệnh. Sau đó, bạn có thể kiểm tra xem có sự cố nào được tìm thấy hay không bằng cách sử dụng ls
để hiển thị danh sách folder chứa các file lỗi nào đã được tạo.
Bạn có thể cần cải thiện dữ liệu đầu vào JSON của bạn vì việc sử dụng file đầu vào phức tạp hơn có khả năng cải thiện chất lượng kết quả hiển thị của bạn. Tránh sử dụng file lớn hoặc file chứa nhiều dữ liệu lặp lại — file đầu vào lý tưởng là file có kích thước nhỏ nhưng vẫn chứa càng nhiều phần tử 'phức tạp' càng tốt. Ví dụ: một file đầu vào tốt sẽ chứa các mẫu dữ liệu được lưu trữ ở tất cả các định dạng, bao gồm chuỗi, số nguyên, boolean, danh sách và đối tượng, cũng như dữ liệu lồng nhau nếu có thể.
Bạn đã sử dụng Radamsa để làm mờ một ứng dụng dòng lệnh. Tiếp theo, bạn sẽ sử dụng Radamsa để đánh dấu các yêu cầu tới các dịch vụ mạng.
Bước 4 - Yêu cầu Fuzzing tới Dịch vụ Mạng
Radamsa cũng được dùng để làm mờ các dịch vụ mạng, hoạt động như một client hoặc server mạng. Trong bước này, bạn sẽ sử dụng Radamsa để đánh dấu một dịch vụ mạng, trong đó Radamsa đóng role là client .
Mục đích của các dịch vụ mạng fuzzing là để kiểm tra mức độ phục hồi của một dịch vụ mạng cụ thể đối với các client gửi dữ liệu đó không đúng định dạng và / hoặc độc hại. Nhiều dịch vụ mạng như web server hoặc server DNS thường được tiếp xúc với internet, nghĩa là chúng là mục tiêu chung cho những kẻ tấn công. Một dịch vụ mạng không đủ khả năng chống lại việc nhận dữ liệu không đúng định dạng có thể gặp sự cố, hoặc thậm chí là hỏng hóc ở trạng thái mở, cho phép kẻ tấn công đọc dữ liệu nhạy cảm như khóa mã hóa hoặc dữ liệu user .
Kỹ thuật cụ thể để làm mờ các dịch vụ mạng khác nhau rất nhiều tùy thuộc vào dịch vụ mạng được đề cập, tuy nhiên trong ví dụ này, ta sẽ sử dụng Radamsa để làm mờ một web server cơ bản phục vụ nội dung HTML tĩnh.
Đầu tiên, bạn cần cài đặt web server để sử dụng cho quá trình thử nghiệm. Bạn có thể thực hiện việc này bằng server phát triển tích hợp đi kèm với gói php-cli
. Bạn cũng cần curl
để kiểm tra web server của bạn .
Nếu bạn chưa cài đặt php-cli
và / hoặc curl
, bạn có thể cài đặt chúng bằng cách sử dụng apt
:
- sudo apt install php-cli curl
Tiếp theo, tạo một folder để lưu trữ các file web server của bạn và chuyển vào đó:
- mkdir ~/www
- cd ~/www
Sau đó, tạo một file HTML chứa một số văn bản mẫu:
- nano index.html
Thêm phần sau vào file :
<h1>Hello, world!</h1>
Đến đây bạn có thể chạy web server PHP của bạn . Bạn cần có thể xem log web server trong khi vẫn sử dụng một phiên terminal khác, vì vậy hãy mở một phiên terminal khác và SSH cho server của bạn cho việc này:
- cd ~/www
- php -S localhost:8080
Điều này sẽ xuất ra một cái gì đó tương tự như sau:
OutputPHP 7.2.24-0ubuntu0.18.04.1 Development Server started at Wed Jan 1 16:06:41 2020 Listening on http://localhost:8080 Document root is /home/user/www Press Ctrl-C to quit.
Đến đây bạn có thể chuyển về phiên terminal ban đầu của bạn và kiểm tra xem web server có đang hoạt động hay không bằng cách sử dụng curl
:
- curl localhost:8080
Thao tác này sẽ xuất ra index.html
mẫu mà bạn đã tạo trước đó:
Output<h1>Hello, world!</h1>
Web server của bạn chỉ cần có thể truy cập local , vì vậy bạn không nên mở bất kỳ cổng nào trên firewall cho nó.
Đến đây bạn đã cài đặt web server thử nghiệm của bạn , bạn có thể bắt đầu kiểm tra nó bằng Radamsa.
Trước tiên, bạn cần tạo một yêu cầu HTTP mẫu để sử dụng làm dữ liệu đầu vào cho Radamsa. Tạo một file mới để lưu trữ file này trong:
- nano http-request.txt
Sau đó, sao chép yêu cầu HTTP mẫu sau vào file :
GET / HTTP/1.1 Host: localhost:8080 User-Agent: test Accept: */*
Tiếp theo, bạn có thể sử dụng Radamsa để gửi yêu cầu HTTP này đến web server local của bạn . Để thực hiện việc này, bạn cần sử dụng Radamsa làm ứng dụng client TCP, có thể được thực hiện bằng cách chỉ định địa chỉ IP và cổng để kết nối:
- radamsa -o 127.0.0.1:8080 http-request.txt
Lưu ý: Lưu ý rằng việc sử dụng Radamsa làm ứng dụng client TCP sẽ có khả năng khiến dữ liệu không đúng định dạng / độc hại được truyền qua mạng. Điều này có thể làm hỏng mọi thứ, vì vậy hãy hết sức cẩn thận chỉ truy cập các mạng mà bạn được phép kiểm tra, hoặc tốt hơn là sử dụng địa chỉ localhost ( 127.0.0.1
).
Cuối cùng, nếu bạn xem log được xuất cho web server local của bạn , bạn sẽ thấy rằng nó đã nhận được yêu cầu, nhưng rất có thể không xử lý chúng vì chúng không hợp lệ / không đúng định dạng.
Các bản ghi đã xuất sẽ hiển thị trong cửa sổ terminal thứ hai của bạn:
Output[Wed Jan 1 16:26:49 2020] 127.0.0.1:49334 Invalid request (Unexpected EOF) [Wed Jan 1 16:28:04 2020] 127.0.0.1:49336 Invalid request (Malformed HTTP request) [Wed Jan 1 16:28:05 2020] 127.0.0.1:49338 Invalid request (Malformed HTTP request) [Wed Jan 1 16:28:07 2020] 127.0.0.1:49340 Invalid request (Unexpected EOF) [Wed Jan 1 16:28:08 2020] 127.0.0.1:49342 Invalid request (Malformed HTTP request)
Để có kết quả tối ưu và đảm bảo rằng các sự cố được ghi lại, bạn có thể cần viết một tập lệnh tự động hóa tương tự như tập lệnh được sử dụng trong Bước 3. Bạn cũng nên xem xét sử dụng file đầu vào phức tạp hơn, có thể chứa các bổ sung như tiêu đề HTTP bổ sung.
Bạn đã tạo ra một dịch vụ mạng bằng cách sử dụng Radamsa hoạt động như một client TCP. Tiếp theo, bạn sẽ làm mờ một client mạng với Radamsa hoạt động như một server .
Bước 5 - Ứng dụng client mạng Fuzzing
Trong bước này, bạn sẽ sử dụng Radamsa để kiểm tra một ứng dụng client mạng. Điều này đạt được bằng cách chặn các phản hồi từ một dịch vụ mạng và làm mờ chúng trước khi chúng được khách hàng nhận.
Mục đích của kiểu đánh lừa này là để kiểm tra xem các ứng dụng client mạng có khả năng phục hồi như thế nào khi nhận dữ liệu không đúng định dạng hoặc độc hại từ các dịch vụ mạng. Ví dụ: kiểm tra trình duyệt web (máy khách) nhận HTML không đúng định dạng từ web server (dịch vụ mạng) hoặc kiểm tra client DNS nhận phản hồi DNS không đúng định dạng từ server DNS.
Như trường hợp của các ứng dụng dòng lệnh hoặc dịch vụ mạng, kỹ thuật chính xác để làm mờ từng ứng dụng client mạng khác nhau đáng kể, tuy nhiên trong ví dụ này, bạn sẽ sử dụng whois
, một ứng dụng gửi / nhận đơn giản dựa trên TCP.
Ứng dụng whois
được sử dụng để thực hiện các yêu cầu tới server WHOIS và nhận các bản ghi WHOIS dưới dạng phản hồi. WHOIS hoạt động trên cổng TCP 43
ở dạng văn bản rõ ràng, làm cho nó trở thành một thành phần tốt để kiểm tra lông tơ dựa trên mạng.
Nếu bạn chưa có sẵn whois
, bạn có thể cài đặt nó bằng cách sử dụng apt
:
- sudo apt install whois
Đầu tiên, bạn cần lấy một phản hồi whois
mẫu để sử dụng làm dữ liệu đầu vào của bạn . Bạn có thể thực hiện việc này bằng cách đưa ra yêu cầu whois
và lưu kết quả kết quả vào một file . Bạn có thể sử dụng bất kỳ domain nào bạn muốn tại đây khi bạn đang thử nghiệm chương trình whois
local bằng cách sử dụng dữ liệu mẫu:
- whois example.com > whois.txt
Tiếp theo, bạn cần cài đặt Radamsa như một server phục vụ các version bị mờ của phản hồi whois
này. Bạn cần có thể tiếp tục sử dụng terminal của bạn sau khi Radamsa đang chạy ở chế độ server , vì vậy bạn nên mở một phiên terminal khác và kết nối SSH với server của bạn cho việc này:
- radamsa -o :4343 whois.txt -n inf
Radamsa hiện sẽ chạy ở chế độ server TCP và sẽ phục vụ version whois.txt
mỗi khi kết nối với server , dù dữ liệu yêu cầu nào được nhận.
Đến đây bạn có thể tiến hành thử nghiệm ứng dụng client whois
. Bạn cần thực hiện một yêu cầu whois
bình thường cho bất kỳ domain nào bạn chọn (nó không nhất thiết phải giống với domain mà dữ liệu mẫu dành cho), nhưng với whois
đã trỏ đến server Radamsa local của bạn:
- whois -h localhost:4343 example.com
Câu trả lời sẽ là dữ liệu mẫu của bạn, nhưng được Radamsa làm mờ. Bạn có thể tiếp tục thực hiện các yêu cầu tới server local miễn là Radamsa đang chạy và nó sẽ cung cấp một phản hồi mờ khác nhau mỗi lần.
Cũng như các dịch vụ mạng fuzzing, để nâng cao hiệu quả của việc kiểm tra fuzz client mạng này và đảm bảo mọi sự cố đều được ghi lại, bạn có thể viết một tập lệnh tự động hóa tương tự như tập lệnh được sử dụng trong Bước 3.
Trong bước cuối cùng này, bạn đã sử dụng Radamsa để tiến hành kiểm tra mờ một ứng dụng client mạng.
Kết luận
Trong bài viết này, bạn đã cài đặt Radamsa và sử dụng nó để làm mờ ứng dụng dòng lệnh, dịch vụ mạng và client mạng. Như vậy, bạn đã có kiến thức nền tảng cần thiết để kiểm tra các ứng dụng của riêng mình, hy vọng với kết quả là cải thiện độ mạnh mẽ và khả năng chống lại sự tấn công của chúng.
Nếu bạn muốn khám phá thêm về Radamsa, bạn có thể cần xem lại file Radamsa README
chi tiết, vì nó chứa thêm thông tin kỹ thuật và ví dụ về cách sử dụng công cụ:
Bạn cũng có thể cần xem một số công cụ làm mờ khác như American Fuzzy Lop (AFL), là một công cụ làm mờ tiên tiến được thiết kế để kiểm tra các ứng dụng binary với tốc độ và độ chính xác cực cao:
Các tin liên quan
Cách cài đặt Tinc và thiết lập VPN cơ bản trên Ubuntu 18.042020-01-21
Cách thiết lập Nền tảng Eclipse Theia Cloud IDE trên Ubuntu 18.04
2020-01-06
Cách sử dụng Ansible để cài đặt và thiết lập WordPress với LAMP trên Ubuntu 18.04
2019-12-31
Cách cài đặt WordPress với OpenLiteSpeed trên Ubuntu 18.04
2019-12-18
Cách sử dụng Ansible để cài đặt và thiết lập LAMP trên Ubuntu 18.04
2019-12-17
Cách sử dụng Ansible để cài đặt và thiết lập LEMP trên Ubuntu 18.04
2019-12-05
Cách cài đặt và sử dụng TimescaleDB trên Ubuntu 18.04
2019-12-04
Cách lấy chứng chỉ Let's Encrypt bằng Ansible trên Ubuntu 18.04
2019-11-14
Cách cài đặt MongoDB trên Ubuntu 16.04
2019-10-13
Cách thêm và xóa người dùng trên Ubuntu 18.04
2019-09-12