วันจันทร์ที่ 17 มิถุนายน พ.ศ. 2556

Linux: 25 PHP Security Best Practices For Sys Admins


PHP is an open-source server-side scripting language and it is a widely used. The Apache web server provides access to files and content via the HTTP OR HTTPS protocol. A misconfigured server-side scripting language can create all sorts of problems. So, PHP should be used with caution. Here are twenty-five php security best practices for sysadmins for configuring PHP securely.

Our Sample Setup For PHP Security Tips

  • DocumentRoot: /var/www/html
  • Default Web server: Apache ( you can use Lighttpd or Nginx instead of Apache)
  • Default PHP configuration file: /etc/php.ini
  • Default PHP extensions config directory: /etc/php.d/
  • Our sample php security config file: /etc/php.d/security.ini (you need to create this file using a text editor)
  • Operating systems: RHEL / CentOS / Fedora Linux (the instructions should work with any other Linux distributions such as Debian / Ubuntu or other Unix like operating systems such as OpenBSD/FreeBSD/HP-UX).
  • Default php server TCP/UDP ports: none
Most of the actions listed in this post are written with the assumption that they will be executed by the root user running the bash or any other modern shell:
$ php -v
Sample outputs:
PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
For demonstration purpose I'm going to use the following operating system:

$ cat /etc/redhat-release

Sample outputs:

PHP 5.3.3 (cli) (built: Oct 24 2011 08:35:41)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
 
For demonstration purpose I'm going to use the following operating system:

$ cat /etc/redhat-release

Sample outputs:

Red Hat Enterprise Linux Server release 6.1 (Santiago)
 

#1: Know Your Enemy

PHP based apps can face the different types of attacks. I have noticed the different types of attacks:
  1. XSS - Cross-site scripting is a vulnerability in php web applications, which attackers may exploit to steal users' information. You can configure Apache and write more secure PHP scripts (validating all user input) to avoid xss attacks.
  2. SQL injection - It is a vulnerability in the database layer of an php application. When user input is incorrectly filtered any SQL statements can be executed by the application. You can configure Apache and write secure code (validating and escaping all user input) to avoid SQL injection attacks. A common practice in PHP is to escape parameters using the function called mysql_real_escape_string() before sending the SQL query.
    Spoofing
  3. File uploads - It allows your visitor to place files (upload files) on your server. This can result into various security problems such as delete your files, delete database, get user details and much more. You can disable file uploads using php or write secure code (like validating user input and only allow image file type such as png or gif).
  4. Including local and remote files - An attacker can open files from remote server and execute any PHP code. This allows them to upload file, delete file and install backdoors. You can configure php to disable remote file execution.
  5. eval() - Evaluate a string as PHP code. This is often used by an attacker to hide their code and tools on the server itself. You can configure php to disable eval().
  6. Sea-surf Attack (Cross-site request forgery - CSRF) - This attack forces an end user to execute unwanted actions on a web application in which he/she is currently authenticated. A successful CSRF exploit can compromise end user data and operation in case of normal user. If the targeted end user is the administrator account, this can compromise the entire web application.

#2: Find Built-in PHP Modules

To see the set of compiled-in PHP modules type the following command:

# php -m

Sample outputs:

[PHP Modules]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
gmp
hash
iconv
imap
json
libxml
mbstring
memcache
mysql
mysqli
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
Reflection
session
shmop
SimpleXML
sockets
SPL
sqlite3
standard
suhosin
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
xsl
zip
zlib
[Zend Modules]
Suhosin 
 
I recommends that you use PHP with a reduced modules for performance and security. For example, you can disable sqlite3 module by deleting (removing) configuration file , OR renaming (moving) a file called /etc/php.d/sqlite3.ini as follows:

# rm /etc/php.d/sqlite3.ini

OR

# mv /etc/php.d/sqlite3.ini /etc/php.d/sqlite3.disable

Other compiled-in modules can only be removed by reinstallating PHP with a reduced configuration. You can download php source code from php.net and compile it as follows with GD, fastcgi, and MySQL support:

./configure --with-libdir=lib64 --with-gd --with-mysql --prefix=/usr --exec-prefix=/
usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/
usr/include --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/usr/com --mandir=/
usr/share/man --infodir=/usr/share/info --cache-file=../config.cache --with-config-file-path=/
etc --with-config-file-scan-dir=/etc/php.d  --enable-fastcgi --enable-force-cgi-redirect
 
See how to compile and reinstall php on Unix like operating system for more information.

#3: Restrict PHP Information Leakage

To restrict PHP information leakage disable expose_php. Edit /etc/php.d/secutity.ini and set the following directive:

expose_php=Off
 
When enabled, expose_php reports to the world that PHP is installed on the server, which includes the PHP version within the HTTP header (e.g., X-Powered-By: PHP/5.3.3). The PHP logo guids (see example) are also exposed, thus appending them to the URL of a PHP enabled site will display the appropriate logo. When expose_php enabled you can see php version using the following command:

$ curl -I http://www.cyberciti.biz/index.php

Sample outputs:

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.3
Content-type: text/html; charset=UTF-8
Vary: Accept-Encoding, Cookie
X-Vary-Options: Accept-Encoding;list-contains=gzip,Cookie;string-contains=
wikiToken;string-contains=wikiLoggedOut;string-contains=wiki_session
Last-Modified: Thu, 03 Nov 2011 22:32:55 GMT
... 
 
I also recommend that you setup the ServerTokens and ServerSignature directives in httpd.conf to hide Apache version and other information.

#4: Minimize Loadable PHP Modules (Dynamic Extensions)

PHP supports "Dynamic Extensions". By default, RHEL loads all the extension modules found in /etc/php.d/ directory. To enable or disable a particular module, just find the configuration file in /etc/php.d/ directory and comment the module name. You can also rename or delete module configuration file. For best PHP performance and security, you should only enable the extensions your webapps requires. For example, to disable gd extension, type the following commands:

# cd /etc/php.d/
# mv gd.{ini,disable}
# /sbin/service httpd restart

To enable php module called gd, enter:
# mv gd.{disable,ini}
# /sbin/service httpd restart

#5: Log All PHP Errors

Do not expose PHP error messages to all site visitors. Edit /etc/php.d/security.ini and set the following directive:


display_errors=Off
 
Make sure you log all php errors to a log file:

log_errors=On
error_log=/var/log/httpd/php_scripts_error.log

#6: Disallow Uploading Files

Edit /etc/php.d/security.ini and set the following directive to disable file uploads for security reasons:

file_uploads=Off
 
If users of your application need to upload files, turn this feature on by setting upload_max_filesize limits the maximum size of files that PHP will accept through uploads:

file_uploads=On
# user can only upload upto 1MB via php
upload_max_filesize=1M
 

#7: Turn Off Remote Code Execution

If enabled, allow_url_fopen allows PHP's file functions -- such as file_get_contents() and the include and require statements -- can retrieve data from remote locations, like an FTP or web site.
The allow_url_fopen option allows PHP's file functions - such as file_get_contents() and the include and require statements - can retrieve data from remote locations using ftp or http protocols. Programmers frequently forget this and don't do proper input filtering when passing user-provided data to these functions, opening them up to code injection vulnerabilities. A large number of code injection vulnerabilities reported in PHP-based web applications are caused by the combination of enabling allow_url_fopen and bad input filtering. Edit /etc/php.d/security.ini and set the following directive:

allow_url_fopen=Off
 
I also recommend to disable allow_url_include for security reasons:

allow_url_include=Off

#8: Enable SQL Safe Mode

Edit /etc/php.d/security.ini and set the following directive:

sql.safe_mode=On
 
If turned On, mysql_connect() and mysql_pconnect() ignore any arguments passed to them. Please note that you may have to make some changes to your code. Third party and open source application such as WordPress, and others may not work at all when sql.safe_mode enabled. I also recommend that you turn off magic_quotes_gpc for all php 5.3.x installations as the filtering by it is ineffective and not very robust. mysql_escape_string() and custom filtering functions serve a better purpose (hat tip to Eric Hansen):

magic_quotes_gpc=Off

#9: Control POST Size

The HTTP POST request method is used when the client (browser or user) needs to send data to the Apache web server as part of the request, such as when uploading a file or submitting a completed form. Attackers may attempt to send oversized POST requests to eat your system resources. You can limit the maximum size POST request that PHP will process. Edit /etc/php.d/security.ini and set the following directive:

; Set a realistic value here 
post_max_size=1K
 
The 1K sets max size of post data allowed by php apps. This setting also affects file upload. To upload large files, this value must be larger than upload_max_filesize. I also suggest that you limit available methods using Apache web server. Edit, httpd.conf and set the following directive for DocumentRoot /var/www/html:
 
<Directory /var/www/html>
    <LimitExcept GET POST>
        Order allow,deny
    </LimitExcept>
## Add rest of the config goes here... ##
</Directory>
 

#10: Resource Control (DoS Control)

You can set maximum execution time of each php script, in seconds. Another recommend option is to set maximum amount of time each script may spend parsing request data, and maximum amount of memory a script may consume. Edit /etc/php.d/security.ini and set the following directives:

# set in seconds
max_execution_time =  30
max_input_time = 30
memory_limit = 40M
 

#11: Install Suhosin Advanced Protection System for PHP

From the project page:
Suhosin is an advanced protection system for PHP installations. It was designed to protect servers and users from known and unknown flaws in PHP applications and the PHP core. Suhosin comes in two independent parts, that can be used separately or in combination. The first part is a small patch against the PHP core, that implements a few low-level protections against bufferoverflows or format string vulnerabilities and the second part is a powerful PHP extension that implements all the other protections.
See how to install and configure suhosin under Linux operating systems.

#12 Disabling Dangerous PHP Functions

PHP has a lot of functions which can be used to crack your server if not used properly. You can set list of functions in /etc/php.d/security.ini using disable_functions directive:
 
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,
parse_ini_file,show_source
 

#13 PHP Fastcgi / CGI - cgi.force_redirect Directive

PHP work with FastCGI. Fascgi reduces the memory footprint of your web server, but still gives you the speed and power of the entire PHP language. You can configure Apache2+PHP+FastCGI or cgi as described here. The configuration directive cgi.force_redirect prevents anyone from calling PHP directly with a URL like http://www.cyberciti.biz/cgi-bin/php/hackerdir/backdoor.php. Turn on cgi.force_redirect for security reasons. Edit /etc/php.d/security.ini and set the following directive:

; Enable cgi.force_redirect for security reasons in a typical *Apache+PHP-CGI/FastCGI* setup
cgi.force_redirect=On
 

#14 PHP User and Group ID

mod_fastcgi is a cgi-module for Apache web server. It can connect to an external FASTCGI server. You need to make sure php run as non-root user. If PHP executes as a root or UID under 100, it may access and/or manipulate system files. You must execute PHP CGIs as a non-privileged user using Apache's suEXEC or mod_suPHP. The suEXEC feature provides Apache users the ability to run CGI programs under user IDs different from the user ID of the calling web server. In this example, my php-cgi is running as phpcgi user and apache is running as apache user:

# ps aux | grep php-cgi
 
Sample outputs:

phpcgi      6012  0.0  0.4 225036 60140 ?        S    Nov22   0:12 /usr/bin/php-cgi
phpcgi      6054  0.0  0.5 229928 62820 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6055  0.1  0.4 224944 53260 ?        S    Nov22   0:18 /usr/bin/php-cgi
phpcgi      6085  0.0  0.4 224680 56948 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6103  0.0  0.4 224564 57956 ?        S    Nov22   0:11 /usr/bin/php-cgi
phpcgi      6815  0.4  0.5 228556 61220 ?        S    00:52   0:19 /usr/bin/php-cgi
phpcgi      6821  0.3  0.5 228008 61252 ?        S    00:55   0:12 /usr/bin/php-cgi
phpcgi      6823  0.3  0.4 225536 58536 ?        S    00:57   0:13 /usr/bin/php-cgi
 
You can use tool such as spawn-fcgi to spawn remote and local FastCGI processes as phpcgi user (first, add phpcgi user to the system):

# spawn-fcgi -a 127.0.0.1 -p 9000 -u phpcgi -g phpcgi -f /usr/bin/php-cgi

Now, you can configure Apache, Lighttpd, and Nginx web server to use external php FastCGI running on port 9000 at 127.0.0.1 IP address.

#15 Limit PHP Access To File System

The open_basedir directive set the directories from which PHP is allowed to access files using functions like fopen(), and others. If a file is outside of the paths defined by open_basdir, PHP will refuse to open it. You cannot use a symbolic link as a workaround. For example only allow access to /var/www/html directory and not to /var/www, or /tmp or /etc directories:

; Limits the PHP process from accessing files outside 
; of specifically designated directories such as /var/www/html/
open_basedir="/var/www/html/"
; ------------------------------------
; Multiple dirs example 
; open_basedir="/home/httpd/vhost/cyberciti.biz/html/:/home/httpd/vhost/
nixcraft.com/html/:/home/httpd/vhost/theos.in/html/"
; ------------------------------------
 

#16 Session Path

Session support in PHP consists of a way to preserve certain data across subsequent accesses. This enables you to build more customized applications and increase the appeal of your web site. This path is defined in /etc/php.ini file and all data related to a particular session will be stored in a file in the directory specified by the session.save_path option. The default is as follows under RHEL/CentOS/Fedora Linux:

session.save_path="/var/lib/php/session"
; Set the temporary directory used for storing files when doing file upload
upload_tmp_dir="/var/lib/php/session"
 
Make sure path is outside /var/www/html and not readable or writeable by any other system users:

# ls -Z /var/lib/php/

Sample outputs:

drwxrwx---. root apache system_u:object_r:httpd_var_run_t:s0 session
 
Note: The -Z option to the ls command display SELinux security context such as file mode, user, group, security context and file name.

#17 Keep PHP, Software, And OS Up to Date

Applying security patches is an important part of maintaining Linux, Apache, PHP, and MySQL server. All php security update should be reviewed and applied as soon as possible using any one of the following tool (if you're installing PHP via a package manager):

# yum update

OR

# apt-get update && apt-get upgrade

You can configure Red hat / CentOS / Fedora Linux to send yum package update notification via email. Another option is to apply all security updates via a cron job. Under Debian / Ubuntu Linux you can use apticron to send security notifications.
Note: Check php.net for the most recent release for source code installations.

#18: Restrict File and Directory Access

Make sure you run Apache as a non-root user such as Apache or www. All files and directory should be owned by non-root user (or apache user) under /var/www/html:

# chown -R apache:apache /var/www/html/


/var/www/html/ is a subdirectory and DocumentRoot which is modifiable by other users since root never executes any files out of there, and shouldn't be creating files in there.
Make sure file permissions are set to 0444 (read-only) under /var/www/html/:

# chmod -R 0444 /var/www/html/

Make sure all directories permissions are set to 0445 under /var/www/html/:

# find /var/www/html/ -type d -print0 | xargs -0 -I {} chmod 0445 {}

A Note About Setting Up Correct File Permissions

The chown and chmod command make sures that under no circumstances DocumentRoot or files contained in DocumentRoot are writable by the Web server user apache. Please note that you need to set permissions that makes the most sense for the development model of your website, so feel free to adjust the chown and chmod command as per your requirements. In this example, the Apache server run as apache user. This is configured with the User and Group directives in your httpd.conf file. The apache user needs to have read access to everything under DocumentRoot but should not have write access to anything.
Make sure httpd.conf has the following directives for restrictive configuration:
 
<Directory / >
    Options None
    AllowOverride None
    Order allow,deny
</Directory>
 
You should only grant write access when required. Some web applications such as wordpress and others may need a caching directory. You can grant a write access to caching directory using the following commands:

# chmod a+w /var/www/html/blog/wp-content/cache
### block access to all ###
# echo 'deny from all' > /var/www/html/blog/wp-content/cache/.htaccess

#19: Write Protect Apache, PHP, and, MySQL Configuration Files

Use the chattr command to write protect configuration files:

# chattr +i /etc/php.ini
# chattr +i /etc/php.d/*
# chattr +i /etc/my.ini
# chattr +i /etc/httpd/conf/httpd.conf
# chattr +i /etc/


The chattr command can write protect your php file or files in /var/www/html directory too:

# chattr +i /var/www/html/file1.php
# chattr +i /var/www/html/

#20: Use Linux Security Extensions (such as SELinux)

Linux comes with various security patches which can be used to guard against misconfigured or compromised server programs. If possible use SELinux and other Linux security extensions to enforce limitations on network and other programs. For example, SELinux provides a variety of security policies for Linux kernel and Apache web server. To list all Apache SELinux protection variables, enter:

# getsebool -a | grep httpd
Sample outputs:

allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_read_user_content --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
 
To disable Apache cgi support, enter:

# setsebool -P httpd_enable_cgi off

See Red Hat SELinux guide for more information.

#21 Install Mod_security

ModSecurity is an open source intrusion detection and prevention engine for web applications. You can easily install mod_security under Linux and protect apache and php based apps from xss and various other attacks:
 
## A few Examples ##
# Do not allow to open files in /etc/
SecFilter /etc/
 
# Stop SQL injection
SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"
 

#22 Run Apache / PHP In a Chroot Jail If Possible

Putting PHP and/or Apache in a chroot jail minimizes the damage done by a potential break-in by isolating the web server to a small section of the filesystem. You can use traditional chroot kind of setup with Apache. However, I recommend FreeBSD jails, XEN virtulization, KVM virtulization, or OpenVZ virtualization which uses the concept of containers.

#23 Use Firewall To Restrict Outgoing Connections

The attacker will download file locally on your web-server using tools such as wget. Use iptables to block outgoing connections from apache user. The ipt_owner module attempts to match various characteristics of the packet creator, for locally generated packets. It is only valid in the OUTPUT chain. In this example, allow vivek user to connect outside using port 80 (useful for RHN or centos repo access):
 
/sbin/iptables -A OUTPUT -o eth0 -m owner --uid-owner vivek -p tcp --dport 80 -m state --
state NEW,ESTABLISHED  -j ACCEPT
 
Here is another example that blocks all outgoing connections from apache user except to our own smtp server, and spam validation API service:
 
# ....  
/sbin/iptables --new-chain apache_user
/sbin/iptables --append OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables --append OUTPUT -m owner --uid-owner apache -j apache_user
# allow apache user to connec to our smtp server 
/sbin/iptables --append apache_user -p tcp --syn -d 192.168.1.100 --dport 25 -j RETURN
# Allow apache user to connec to api server for spam validation
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.62 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  66.135.58.61 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.89 --dport 80 -j RETURN
/sbin/iptables --append apache_user -p tcp --syn -d  72.233.69.88 --dport 80 -j RETURN
#########################
## Add more rules here ##
#########################
# No editing below
# Drop everything for apache outgoing connection
/sbin/iptables --append apache_user -j REJECT
 

#24 Watch Your Logs & Auditing

Check the apache log file:

# tail -f /var/log/httpd/error_log
# grep 'login.php' /var/log/httpd/error_log
# egrep -i "denied|error|warn" /var/log/httpd/error_log


Check the php log file:

# tail -f /var/log/httpd/php_scripts_error.log
# grep "...etc/passwd" /var/log/httpd/php_scripts_error.log


Log files will give you some understanding of what attacks is thrown against the server and allow you to check if the necessary level of security is present or not. The auditd service is provided for system auditing. Turn it on to audit SELinux events, authetication events, file modifications, account modification and so on. I also recommend using standard "Linux System Monitoring Tools" for monitoring your web-server.

#25 Run Service Per System or VM Instance

For large installations it is recommended that you run, database, static, and dynamic content from different servers.

///////////////
/ ISP/Router /
//////////////
  \
   |
   Firewall
     \
      |
     +------------+
     | LB01       |
     +------------+                 +--------------------------+
                  |                 | static.lan.cyberciti.biz |
    +-----------------+--------------------------+
                                    | phpcgi1.lan.cyberciti.biz|
                                    +--------------------------+
                                    | phpcgi2.lan.cyberciti.biz|
                                    +--------------------------+
                                    | mysql1.lan.cyberciti.biz |
                                    +--------------------------+
                                    | mcache1.lan.cyberciti.biz|
                                    +--------------------------+ 
 
(Fig.01: Running Services On Separate Servers)
Run different network services on separate servers or VM instances. This limits the number of other services that can be compromised. For example, if an attacker able to successfully exploit a software such as Apache flow, he / she will get an access to entire server including other services running on the same server (such as MySQL, e-mail server and so on). But, in the above example content are served as follows:
  1. static.lan.cyberciti.biz - Use lighttpd or nginx server for static assets such as js/css/images.
  2. phpcgi1.lan.cyberciti.biz and phpcgi2.lan.cyberciti.biz - Apache web-server with php used for generating dynamic content.
  3. mysql1.lan.cyberciti.biz - MySQL database server.
  4. mcache1.lan.cyberciti.biz - Memcached server is very fast caching system for MySQL. It uses libevent or epoll (Linux runtime) to scale to any number of open connections and uses non-blocking network I/O.
  5. LB01 - A nginx web and reverse proxy server in front of Apache Web servers. All connections coming from the Internet addressed to one of the Web servers are routed through the nginx proxy server, which may either deal with the request itself or pass the request wholly or partially to the main web servers. LB01 provides simple load-balancing.

#26 Additional Tools

From the project page:
PHPIDS (PHP-Intrusion Detection System) is a simple to use, well structured, fast and state-of-the-art security layer for your PHP based web application. The IDS neither strips, sanitizes nor filters any malicious input, it simply recognizes when an attacker tries to break your site and reacts in exactly the way you want it to.
You can use PHPIDS to detect malicious users, and log any attacks detected for later review. Please note that I've personally not used this tool.
From the project page:
PhpSecInfo provides an equivalent to the phpinfo() function that reports security information about the PHP environment, and offers suggestions for improvement. It is not a replacement for secure development techniques, and does not do any kind of code or app auditing, but can be a useful tool in a multilayered security approach.
Security Information About PHP Application
Fig.02: Security Information About PHP Application
See Linux security hardening tips which can reduce available vectors of attack on the system.

A Note About PHP Backdoors

You may come across php scripts or so called common backdoors such as c99, c99madshell, r57 and so on. A backdoor php script is nothing but a hidden script for bypassing all authentication and access your server on demand. It is installed by an attackers to access your server while attempting to remain undetected. Typically a PHP (or any other CGI script) script by mistake allows inclusion of code exploiting vulnerabilities in the web browser. An attacker can use such exploiting vulnerabilities to upload backdoor shells which can give him or her a number of capabilities such as:
  • Download files
  • Upload files
  • Install rootkits
  • Set a spam mail servers / relay server
  • Set a proxy server to hide tracks
  • Take control of server
  • Take control of database server
  • Steal all information
  • Delete all information and database
  • Open TCP / UDP ports and much more

Tip: How Do I Search PHP Backdoors?

Use Unix / Linux grep command to search c99 or r57 shell:

# grep -iR 'c99' /var/www/html/
# grep -iR 'r57' /var/www/html/
# find /var/www/html/ -name \*.php -type f -print0 | xargs -0 grep c99
# grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/html/

Conclusion

Your PHP based server is now properly harden and ready to show dynamic webpages. However, vulnerabilities are caused mostly by not following best practice programming rules. You should be consulted further resources for your web applications security needs especially php programming which is beyond the scope of sys admin work.

References:

  1. PHP security - from the official php project.
  2. PHP security guide - from the PHP security consortium project.
  3. Apache suseexec - documentation from the Apache project.
  4. Apache 2.2 - security tips from the Apache project.
  5. The Open Web Application Security Project - Common types of application security attacks.

Recommended readings:

  1. PHP Security Guide: This guide aims to familiarise you with some of the basic concepts of online security and teach you how to write more secure PHP scripts. It's aimed squarely at beginners, but I hope that it still has something to offer more advanced users.
  2. Essential PHP Security (kindle edition): A book about web application security written specifically for PHP developers. It covers 30 of the most common and dangerous exploits as well as simple and effective safeguards that protect your PHP applications.
  3. SQL Injection Attacks and Defense This book covers sql injection and web-related attacks. It explains SQL injection. How to find, confirm, and automate SQL injection discovery. It has tips and tricks for finding SQL injection within the code. You can create exploits using SQL injection and design to avoid the dangers of these attacks.
Please add your favorite php security tool or tip in the comments.
Updated for accuracy!

วันอาทิตย์ที่ 16 มิถุนายน พ.ศ. 2556

Bitcoin สร้างโลกยุคใหม่ด้วยสุดยอดสกุลเงินสายพันธ์ไอที

จะเป็นอย่างไร เมื่อเกิดเงินสกุลใหม่ขึ้นในโลกออนไลน์ แต่ธนาคารต่างพากันรับแลกเปลี่ยนสกุลเงินน้องใหม่นี้
---------------------------------------------------------------------------------------------------------
Bitcoin สร้างโลกยุคใหม่ด้วยสุดยอดสกุลเงินสายพันธ์ไอที

           กระแสออนไลน์ยุคใหม่ผู้คนนิยมจับจ่าย หรือ เลือกซื้อสินค้าผ่านทางระบบอินเทอร์เน็ต เพราะไม่มีพรมแดนกั้นระหว่างกัน ไม่ว่าท่านจะอยู่ซีกไหนของโลกก็สามารถหาร้านค้าออนไลน์ เพื่อจับจ่ายใช้สอยได้ตามต้องการตลอด 24 ชม. ผ่านร้านค้าดัง ๆ ที่เป็นที่ยอมรับกันอย่างทั่วโลก ไม่ว่าจะเป็น Ebay, Amazon หรือจะเป็นร้านค้าออนไลน์สายเลือดคนไทยอย่าง weloveshopping, dealfish, RTB Plus และอื่น ๆ อีกมากมาย แต่ละร้านค้าต่างก็มีวิธีชำระเงินแตกต่างกัน บางร้านค้าให้โอนเงินผ่านบัญชีธนาคาร จ่ายเงินเป็นบัตร True Money บางร้านค้าใช้การชำระเงินผ่านบัตร Visa หรือ Master Card ซึ่งวิธีหลังนี้เป็นวิธีหลัก ๆ ในการชำระเงินหากท่านต้องการ จับจ่ายใช้สอย หรือซื้อหาจับจองสินค้าจากร้านค้าชั้นนำของโลก แต่หากว่าท่านไม่มีบัตร Visa แล้วล่ะก็คงหนีไม่พ้นบริการชำระเงินออนไลน์ โดยใช้บัญชีการเงินออนไลน์ซึ่งหลาย ๆ คนรู้จักดีในชื่อของ Paypal นั่นเองแต่ไม่ได้มีแค่ Paypal เพียงเจ้าเดียว

bitcoinaccepted.jpg

          ในหลาย ๆ ประเทศก็ล้วนมีระบบชำระเงินออนไลน์ผ่านบัญชีออนไลน์ ในรูปแบบเดียวกันกับ Paypal มากมายแม้กระทั่งในประเทศไทยก็มี Paysbuy, TOT e-Payment, True Online Billing & Payment เป็นต้น แต่ทั้งนี้ทั้งนั้นท่านจำเป็นต้องมีเงินสดในมือก่อนจึงนำเงินสดเติมเข้าไปใน บัญชีออนไลน์ ก่อนที่จะสามารถใช้ชำระค่าสินค้าต่าง ๆ ได้ แต่มาวันนี้เรามีวิธีหาเงินรูปแบบใหม่และการชำระเงินรูปแบบใหม่มานำเสนอ นั่นคือ Bitcoin ถ้าหากถามว่ามันคืออะไรก็บอกได้เลยว่าตอนนี้มันเป็นสกุลเงินรูปแบบหนึ่งบน โลกออนไลน์โดยมีสัญลักษณ์ BTC เป็นตัวย่อซึ่งในปัจจุบัน 1 BTC มีค่า 90-100 USD หรือเรียกง่าย ๆ ว่า 1 BTC มีค่าเท่ากับเงินประมาณ 2500-3000 บาทเลยทีเดียว เป็นยังไงเริ่มสนใจอยากลองทำ Bitcoin ดูหรือยัง แต่ก่อนที่จะลองขุด Bitcoin ดูเรามาทำความรู้จักกับ Bitcoin กันซะก่อนดีกว่ามั๊ยหากเปรียบเทียบกันกับระบบชำระเงินทั่ว ๆ ไปแล้วเปรียบเหมือนกับท่านทำงานเพื่อให้ได้เงินมา แล้วนำเงินมาเข้าบัญชีเพื่อให้บัญชีมีการเคลื่อนไหวที่เราเรียกกันว่า Statement เพื่อนำไปใช้เป็นหลักฐานว่าบัญชีเรามีการเคลื่อนไหว เพื่อฝาก-ถอน หรือทำธุรกรรมทางการเงินอื่น ๆ แต่ในโลกของ Bitcoin สิ่งที่ต้องมีคือ Address ซึ่งเปรียบเสมือนกับเลขที่บัญชี และ Block Chain เปรียบเสมือน Statement เพื่อตรวจสอบดูว่าเราทำอะไรไปยังไงบ้าง และสุดท้าย Bitcoin พระเอกของเราก็เปรียบเสมือน ธนบัตร นั่นเองที่ใช้ในการแลกเปลี่ยน หรือจับจ่ายใช้สอยบนโลกออนไลน์นั่นเอง แต่ก็มีความแตกต่างเล็ก ๆ คือปกติเวลาเราฝาก-ถอน หรือทำธุรกรรมการเงินต่าง ๆ แล้วข้อมูลเหล่านี้ทางธนาคารจะเก็บไว้ที่ธนาคารทั้งหมด แต่เจ้าของบัญชีจะได้รับการบันทึกหลักฐานลงในสมุดบัญชีเท่านั้น แต่ในโลกของ Bitcoin นั้นความเคลื่อนไหวต่าง ๆ จะถูกเก็บไว้ที่ Block Chain เท่านั้นซึ่งภายใน Block Chain นั้นจะมีการเก็บทุกข้อมูลการทำธุรกรรมทั้งหมดเอาไว้ และหากเปรียบเทียบในความเป็นจริงแล้ว ธนบัตร จะถูกกำหนดจำนวนผ่านรัฐบาล และจัดจำหน่ายโดยธนาคาร แต่ในโลกของ Bitcoin นั้นแตกต่างกันเพราะเหล่า Bitcoin พวกนี้จะเกิดจากการคำนวณด้วย Algorithms ต่าง ๆ และในโลกของ Bitcoin นั้นไม่มีวันจะเกิดเงินเฟ้อ เพราะด้วย Algorithms ที่ซับซ้อนบวกกับจำนวน Bitcoin ที่มีอยู่อย่างจำกัด ทำให้เมื่อมีคนขุดเจอ Block แล้วระดับความยากในการค้นเจอจะมีมากขึ้น ต่อให้อนาคตมีการค้นพบ Bitcoin มากขึ้น เครื่องคอมพิวเตอร์แรงขึ้น ก็จะไม่ทำให้กระทบกับจำนวนของ Bitcoin เช่นกัน นอกเสียจากว่าจะมี Hacker ที่มีความสามารถมากพอที่จะ Hack โลกของ Bitcoin ได้สำเร็จนั่นเอง

          ถ้าหากเปรียบเทียบกันแล้วเหมือนกับว่าครั้งแรกคุณค้นพบ Bitcoin 1 Block ซึ่งตอนนี้ 1 Block มีค่าเท่ากับ 25 BTC แต่เมื่อระดับความยากเพิ่มขึ้น ค่าของ BTC ที่สามารถแลกได้จะมีค่าลดลงนั่นหมายความว่าในอนาคตนั้น 1 Block นั้นอาจจะมีค่าเพียง 0.1 BTC หรือ 0.0001 BTC ก็เป็นได้ เพราะฉะนั้นต่อให้เจอ Bitcoin มากขึ้นเท่าไรก็ไม่มีความกระเทือนกับระบบเลย และด้วย Algorithms นี้ผู้สร้างระบบเลยรับประกันว่าจะไม่มีเงินเฟ้ออย่างแน่นอน (โดยในช่วงแรกทุก ๆ 10 นาทีจะมีการค้นพบ Block เพียง 1  Block เท่านั้น หมายความว่าในหนึ่งเดือนจะมีการค้นพบ Block เพียงแค่ 4032 Block ต่อเดือนเท่านั้น ซึ่งมูลค่าของ Block แต่ละ Block จะไม่เท่ากัน โดยตั้งแต่ที่มีการเปิดให้ใช้งาน Bitcoin นั้น 210,000 แรกจะมีค่า Block ละ 50 BTC และ 210,000 ต่อมาจะมีมูลค่า Block ละ 25 BTC และจะลดลงครึ่งหนึ่งทุก ๆ 210,000 Block ไปเรื่อย ๆ ซึ่งท้ายที่สุดแล้วมูลค่าของ Bitcoin จะจำกัดอยู่เพียงแค่ 21 ล้าน BTC เท่านั้น และด้วยการขุดบล็อคที่มีอยู่จำกัดนี้เองที่ทำให้ตัว Bitcoin มีมูลค่ามากและสามารถนำมาแลกเปลี่ยนเป็นเงินในชีวิตจริงได้ ) และเมื่อมีการขุดเจอ Bitcoin แล้วจะถูกแจกจ่ายให้กับ Miner ซึ่งก็คือบุคคลที่รัน Software Bitcoin Miner บนเครื่องคอมพิวเตอร์ของ Miner นั่นเองซึ่งจะทำงานและนำรายละเอียดรายการทำงานทั้งหมดมาบันทึกลงใน Block Chain ซึ่งจะทำให้ผู้รัน Software ได้รับ Bitcoin นั่นเอง

Hugo_Bitcoin-cartoon2.jpg

          ในปัจจุบันนี้ธนาคารหลาย ๆ ธนาคารก็รองรับการแลกเปลี่ยนสกุลเงินของ Bitcoin แล้วนี่เป็นการยืนยันได้อีกว่าทางธนาคารยังให้ความเชื่อถือกับสกุลเงินนี้ แล้วอีกด้วย แต่สกุลเงินนี้ไม่เหมือนสกุลเงินทั่วไป แต่จะมีการขึ้นลงเหมือนกับหุ้นหรือทองคำ โดยสามารถซื้อไว้เก็งกำไรได้ และหากว่าท่านต้องการแลกเปลี่ยน Bitcoin เป็นสกุลเงินของแต่ละชาติตามที่ท่านต้องการได้ โดยการแลกเปลี่ยนของท่านทำได้ 2 แบบคือผ่านเวปไซต์ที่รับ Trade Bitcoin หรือประกาศขายซึ่งก็จะไม่เหมือนกับการแลกเปลี่ยนธนบัตรเงินจริงที่มีสถานที่ รับแลกเงินมากมาย แต่ Bitcoin หากท่านประกาศว่าต้องการแลก Bitcoin ก็สามารถทำได้โดยประกาศไว้ว่า 1 BTC ที่ท่านมีต้องการแลกเป็นเงินสกุลใดที่อัตราเท่าใด ถ้าหากว่ามีคนสนใจก็จะเข้ามาแลกเปลี่ยนด้วย แต่ถ้าหากไม่มีคนสนใจท่านก็ต้องถือครอง BTC นั้นต่อไป ซึ่งแตกต่างจากธนบัตรที่มีสกุลเงินของประเทศใด ๆ ที่สามารถแลกเปลี่ยนได้ทุกธนาคาร และทุกธนาคารก็พร้อมที่จะรับแลกทันที ไม่เหมือน Bitcoin ที่ถ้าหากไม่มีคนเอาก็ทำอะไรไม่ได้นั่นเอง แต่ส่วนใหญ่คนที่ถือครอง Bitcoin นั้นจะนำ Bitcoin ไปใช้จับจ่ายใช้สอยในโลกออนไลน์มากกว่า เพราะหลาย ๆ เวปไซต์ที่เป็นร้านค้าชื่อดังก็ยอมให้มีการแลกเปลี่ยนเป็นสกุลเงิน BTC ได้เช่นกันเช่น eBay และ Paypal เป็นต้น นับว่าตอนนี้เป็นอะไรที่กำลังเฟื่องฟูมาก ๆ เพราะว่าตอนนี้เริ่มมีคนขุด Bitcoin มากขึ้นทั้งในอเมริกา และยุโรปหลาย ๆ ประเทศแม้แต่ประเทศเพื่อนบ้านเราอย่างเวียดนาม ก็เปิดขุด Bitcoin กันเยอะอยู่พอสมควรแต่ก็นะ ประเทศไทยก็แบบนี้แหละ ล้าหลังรู้อะไรหลังคนอื่นเขา แต่ตอนนี้เราก็ได้นำเสนอเรื่องนี้ออกมาให้ท่านผู้อ่านได้รับทราบโดยทั่วกัน

     การทำ Bitcoin Mining มีอยู่หลัก ๆ 2 แบบคือ Solo กับ Pool ซึ่งจะแตกต่างกันดังนี้ 1. Solo คือการขุดแบบขุดคนเดียว แบบที่ว่าถึงเวลาถ้าโชคดีเจอ Block Chain ก็ได้ไปคนเดียว แต่ความเป็นไปได้มีตั้งแต่ 0 ขึ้นไปถ้าโชคดีวันเดียวอาจจะเจอ Block Chain เลยก็ได้ หรือถ้าโชคร้ายเปิดขุด 3 เดือนอาจจะไม่เจอเลยก็ได้ แต่ถ้าหากเจอก็ได้รับไปเต็ม ๆ คนเดียวไม่ต้องแบ่งใคร
2. Pool แบบนี้จะมีเวปไซต์เป็นศูนย์กลางเพื่อให้หลาย ๆ คนมาช่วยกันขุด Block Chain ถ้าขุดเจอก็จะนำ BTC มาถัวเฉลี่ยแบ่งกันซึ่งกรณีนี้มีความเสี่ยงน้อยกว่า เพราะถ้าเราขุดมากถ้าเจอก็ยิ่งได้มาก แต่ถ้าเราขุดน้อยก็จะได้น้อย ซึ่งก็เป็นธรรมดี เพราะถ้าเราขุดคนเดียว 3 เดือนไม่ได้เลยเราก็จะไม่ได้อะไร แต่ถ้าเราขุด 3 เดือนแล้วมีคนอื่นได้เราก็ได้กับเขาไปด้วย ซึ่งก็ถือว่าก็เป็นการลดความเสี่ยงได้มากอยู่พอสมควร เพราะยังไงเปอร์เซ็นต์ในการที่จะขุดเจอมันมีเยอะกว่าเพราะช่วยกันขุดหลายคน ไม่ได้ขุดอยู่แค่คนเดียว เรียกได้ว่า Pool นั้นเป็นเสมือนกับรายได้ของทุกคน และจะมีการหักเปอร์เซ็นต์ตามกฏของแต่ละ Pool เสมือนกับค่าดำเนินการนั่นเอง

bitcoin_dsktop_wp_blocks_2_by_carbonism-


    ขั้นตอนการทำ Bitcoin Mining มีอยู่ 3 ขั้นตอนดังนี้

ขั้นตอนแรกคือไปที่เวปไซต์ http://www.bitcoin.org แล้วไปดาวน์โหลด Software ที่ชื่อว่า Bitcoin Wallet มาหลังจากนั้นก็เปิดโปรแกรมขึ้นมา โดยตัว Bitcoin Wallet นี้จะเป็นเหมือนสมุดบัญชีที่จะทำให้เราสามารถเปิดบัญชี เพื่อนำเลขที่บัญชีไปใช้ในการเก็บข้อมูลประวัติการขุด Block ทั้งหลายผ่านโปรแกรมประเภท Miner นั่นเองหลังจากที่เราเปิดโปรแกรม Bitcoin Wallet ขึ้นมาจะต้องรอให้ตัวโปรแกรมคำนวณหา Block ที่มีอยู่ในระบบทั้งหมดให้เสร็จสิ้นเสียก่อน หลังจากนั้นระบบจะทำการ Generate เลขที่ Address ขึ้นมาให้ซึ่งเราต้องเอาเลขที่ Address นี้ไปใส่ใน Software Miner เพื่อให้เก็บข้อมูลเข้าไปในระบบของ Bitcoin หลังจากที่เราได้ Address มาเรียบร้อยแล้วก็ต้องไปหา Software Miner นั่นเอง

687474703a2f2f66742e766d2e746f2f626c6f67


ขั้นตอนที่สอง ให้เราไป Download Software Miner มาในที่นี้จะแนะนำของ http://www.50btc.com ซึ่งจะเป็น Miner แบบ Pool ซึ่งสำหรับคนที่ไม่ได้เปิดเครื่องไว้เพื่อขุด Bitcoin ตลอดเวลาก็น่าจะเหมาะสม หลังจากที่เราสมัครสมาชิกเพื่อเปิดบัญชีเรียบร้อยแล้วระบบแนะนำจะให้เรา Download Software Miner ที่ชื่อว่า 50Miner มาหลังจากที่เรา Download เสร็จสิ้นแล้วจะต้องแตกไฟล์โปรแกรมออกมาไว้ในตำแหน่งใดก็ได้ที่เราต้องการ แล้วทำการ เปิดตัวโปรแกรมขึ้นมา โดยตัวโปรแกรมจะให้เราทำการใส่ Username กับ Password ชื่อของ Pool Server และ Port ที่ทาง Pool นั้นได้ตั้งค่าไว้ให้ เมื่อเราใส่เสร็จแล้วก็จะต้องกดที่ปุ่ม Start เพื่อให้ตัว Software Miner ทำงานหลังจากนั้นก็รอ รอ รอ แล้วก็รอ จนกว่าตัวโปรแกรมจะทำการขุดได้ โดยหากเราขุดในรูปแบบของ Pool นั้นทาง Pool Server จะคิดการขุดของเราเป็นงาน ซึ่งในการขุดแต่ละครั้งจะได้งานไม่เท่ากันขึ้นอยู่กับประสิทธิภาพ และความสามารถของเครื่อง ซึ่งความเร็วในการขุด Block นั้นใช้หน่วยนับที่เรียกว่า MH/s หรือ Mega Hash Per Sec นั่นเองโดยรายละเอียดในส่วนของการคำนวณค่า Hash นี้จะนำเสนอในหัวข้อถัดไป โดยแต่ละงานจะมีราคาของงานไม่เท่ากันขึ้นอยู่กับว่าระดับความยากง่ายของ Share ที่เราขุดอยู่ ถ้าหากว่าเราพึ่งจะเริ่มทำ Mining จะอยู่ที่เลเวล 1 ซึ่งพอเราทำได้ครบหนึ่งงานจะทำ Share ให้กับ Pool Server รับรู้เมื่อรับรู้แล้วจะส่ง Accept/Reject ให้ทราบถ้าหาก Pool Server รับทราบแล้วจะส่งเป็น Accept กลับมาให้เราซึ่งหากเรามี Share Difficulty เลเวล 1 จะได้ค่างานที่ 0.0000270 BTC และค่านี้จะเพิ่มขึ้นเป็นสองเท่าเมื่อ Share Difficulty มีเลเวลเพิ่มขึ้น และจะเพิ่มเป็นสองเท่าขึ้นไปเรื่อย ๆ เช่นถ้า Share Difficulty ที่เลเวลสองจะมีค่างานที่ 0.0000540 BTC และเมื่อถึงเลเวลสามก็จะมีค่างานที่ 0.0001080 BTC เป็นแบบนี้ไปเรื่อย ๆ นั่นเอง และในปัจจุบันมีการทำ Share Difficulty ที่เลเวลสูงสุดที่เลเวล 64 ซึ่งมีค่างานอยู่ที่ 0.0017280 BTC นั่นเอง และที่หน้าเวปไซต์ของ Pool Server นั้นจะมีรายละเอียดบอก เช่นว่าจำนวนงานที่เราขุดไปหากจะแลกให้เป็นเงินแล้วจะอยู่ที่เท่าไร โดยในเวปไซต์ตัวอย่างนั้น จะมีส่วนของการคำนวณให้ทางด้านขวามือที่มีชื่อว่า Reward Calculator ซึ่งสามารถบอกได้ว่าด้วยความเร็วที่เครื่องทำได้ และจำนวนงานในตอนนี้สามารถแลกเป็นเงินได้เท่าไรโดยจะมีสกุลเงินให้เลือก เพียงแค่ 3 สกุลเท่านั้นคือ USD, EUR, RUB นั่นเอง


chart_large_lin_90d.png

ขั้น ตอนสุดท้าย เราสามารถแลกแต้ม BTC ให้เป็นเงินได้โดยเข้าไปที่เมนู Payouts และทำการเบิกแต้มออกมาเป็นเงิน ซึ่งกว่าท่านจะได้เป็นเงินออกมาก็ต้องใช้เวลา ขึ้นอยู่กับว่าเครื่องคอมพิวเตอร์ของท่านสามารถที่จะทำความเร็วต่องานได้มาก น้อยเพียงใด โดยปกติแล้วการประมวลผล Hash นั้นเราจะใช้ CPU ในการทำ Hash แต่ทว่าในปัจจุบันนั้นความสามารถในการประมวลผลฟังก์ชันเหล่านี้นั้นใช้ GPU เข้ามามีส่วนด้วย และที่สำคัญความเร็วในการประมวลผลของ GPU ในปัจจุบันนี้ถือว่ารวดเร็วเอามาก ๆ โดยในโปรแกรม 50Miner นั้นจะมีฟังก์ชันในการใช้ GPU ในการประมวลผลอยู่แล้วทำให้ท่านสามารถนำเครื่องคอมพิวเตอร์ มาใช้งานได้ตามปกติ แม้ว่าท่านจะทำการขุด Bitcoin อยู่ก็ตามซึ่งจะแตกต่างจากการใช้ CPU ในการทำ Mining เพราะว่า CPU คือหน่วยประมวลผลหลักถ้าหากว่าเราใช้ CPU ในการประมวลผลไปแล้วจะทำให้ไม่สามารถใช้งานเครื่อง คอมพิวเตอร์ในด้านอื่นได้นอกจากจะปิด Software Mining เสียก่อน และความเร็วในการประมวลผล Hash ของ CPU นั้นก็ได้น้อยกว่า GPU หลายเท่านักซึ่งหากเปรียบเทียบดูแล้วแทนที่เราจะได้งานเร็วขึ้น และยังมี CPU เหลือในการทำงานอย่างอื่นเรากลับจะต้องเอา CPU มาเสียไปกับการทำ Hash ทำไมอีก ในเมื่อเรามี GPU ในการช่วยประมวลผลด้านนี้อยู่แล้ว

Hashing คืออะไร

gpu-bitcoin_0.jpg

การ ทำ Hashing คือ การนำเอาข้อความใดข้อความหนึ่งมาทำการเข้ารหัสผ่าน Algorithms ใด ๆ เพื่อให้ได้มาซึ่งข้อมูลที่เป็นความลับ ซึ่งการทำ Hashing จะแตกต่างจากการ Encrypt/Decrypt (การเข้ารหัส/ถอดรหัส) ตรงที่ Hashing จะเป็นการเข้ารหัสทางเดียว ไม่สามารถถอดรหัสได้ด้วย Algorithms โดยตรง แต่จะใช้วิธีการสุ่มข้อความต่าง ๆ แล้วนำมาทำ Hashing เพื่อเปรียบเทียบกับ Hashing แรกที่เราต้องการจะ Crack ว่าตรงกันหรือไม่ กรรมวิธีนี้เรียกว่าการทำ Brute-Force ซึ่งเราก็จะมาอธิบายต่อไปว่าความแตกต่างระหว่าง CPU กับ GPU ในการทำ Hashing นั้นแตกต่างกันอย่างไร เนื่องด้วย CPU และ GPU มีความสามารถในการประมวลผลที่แตกต่างกัน แต่สิ่งหนึ่งที่ใช้วัดความสามารถของหน่วยประมวลผลซึ่งเราจะเรียกว่า GFlop/s ซึ่งเป็นการคำนวณทางทศนิยมต่อวินาที โดยไม่ว่าจะเป็น CPU หรือ GPU ต่างสามารถประมวลผลได้ 2 ลักษณะคือ เลขจำนวนเต็ม (Integer ได้แก่ -∞ ถึง -1,0,1 ถึง ∞) และเลขจำนวนจริง (Floating point หรือ เลขทศนิยม ได้แก่ -1.9 -1.8 ...... -1.1,0.1 0.2 ... , 1.0) ซึ่งความสามารถโดยส่วนใหญ่ของ CPU จะเน้นไปที่เลขจำนวนเต็ม และในทางกลับกัน GPU จะมีความสามารถมากในการประมวลผลเลขจำนวนจริง ดังนั้นเราจะเปรียบเทียบให้ดูคร่าว ๆ ยกตัวอย่าง CPU Intel Core i7 3770 มีความเร็วในการประมวลผลที่ 108.8 GFlop/s ที่ราคา 9250 บาทเทียบกับการ์ดจอค่ายแดงอย่าง AMD Radeon HD 7950 ซึ่งมีความเร็วในการประมวลผลที่ 2867.2 GFlop/s ที่ราคา 8900 บาท ถ้าคิดเป็น Gflop ต่อ 1 บาทจะได้ I7-3770 9250/108.8 = 85.018 บาท ต่อ GFlop/s แต่ HD 7950 8900/2867.2 = 3.104 บาท ต่อ GFlop/s จะเห็นได้ชัดเจนเลยว่าการใช้ GPU ในการคำนวณ Hash นั้นคุ้มค่ากว่าการใช้ CPU ราว ๆ 28 เท่าเลยทีเดียว

Bitcoin-developer-Amir-Ta-005.jpg

ปล.ถ้า หากว่าใครเลือกขุดแบบ Solo หากเจอสัก Block เป็นผมจะรอให้ค่า Coin ขึ้นแล้วเอาไปแลกเป็นเงินแล้วเลิกขุดซะ ซื้อคอมชุดใหม่แรง ๆ ไปเลย เพราะกว่าจะขุดได้ใหม่ไม่รู้เมื่อไหร่ ถ้าดวงไม่ดีขุดเป็นปีไม่ได้ก็เสียค่าไฟฟรีนะจะบอกให้ ดังนั้นถ้าได้แล้วเลิกเลย เชื่อผม 555+

 Credits by หนึ่งสมอง สองมือ

Network Analysis With ProxyDroid, BurpSuite, and Hipster Dog

My last post gave an overview of some options to setup your environment for Android network analysis. Of the winners that I pointed out, my personal favorite way to do an assessment (depending on the app) is to use ProxyDroid to forward network traffic to BurpSuite’s proxy.
In the examples below, I’m showing how to get setup with the tools so that you can analyze Instagram’s network traffic.

ProxyDroid

ProxyDroid is a free app on the market or you can check out the open source version and compile it yourself over here. It’s a bunch of proxy tools wrapped up into an Android app that give you a really simple way to tunnel traffic to an endpoint. You’ll need root access to get it to work so that’s the main requirement getting started. Why this is cool:
  • Easily tunnel all network traffic, including data normally sent over the radio
  • Target an individual app instead of an entire device
  • Get setup and running in minutes
We’re setting up my Galaxy Nexus to connect over WiFi and tunnel to another computer on the network. That computer is 192.168.1.146. The assumption is that you have a wireless network that allows clients to connect to eachother.
First thing is set your host to be the computer running Burp Suite. For me it’s 192.168.1.146.
Set your port. Burp’s default is 8080.
Under the “Feature Settings” of the app you have two options for what you want to MiTM. You can either do a “Global Proxy” or “Individual Proxy.” Meaning, the whole phone or a single app. The beauty behind this is that it’s just using iptables to make rules based on the UID given to the app. Anyways, choose the app you want to analyze:
You can give it a profile since you may be coming back to it later but that’s really all you have to do besides hitting the “Proxy Switch” button. When you do, you’ll see a connecting alert appear and a request for root access.

BurpSuite

Now get BurpSuite setup. If you’ve never done this, I’m sure there are a ton of other posts that will explain it so I’m going to assume you at least have used BurpSuite as a proxy before. The only difference here is that because Android does not officially support global proxies such as ProxyDroid, SSL connections are going to be a problem. Our resident SSL guru, Sid, can explain this. The reason is  that the HTTP CONNECT command, normally associated with HTTP proxies, is changed from including the hostname (instagram.com) to just the IP address. This is also the reason that when you see the traffic show up in BurpSuite, it only shows the IP as the target. We’ll come back to this.
The first thing to do is install Burp’s CA onto the device. With ICS, this couldn’t be easier. If you have to do this on Gingerbread or earlier, you’ll have to do it the old way.
The easiest way that I know to pull the BurpSuite CA is to use a browser and just export it. If that doesn’t make sense, read this.
Add that CA to your device or emulator. In short, transfer the Portswigger file you just exported to the device you’re using for testing and import it through the Security Settings. Check out this post for details.
Now open up Burp and make sure Burp’s proxy is listening on the LAN IP and not just the loopback. 192.168.1.146 for this example.
This is the step that a lot of people get lost on. You can’t use the default “Generate CA-signed-per-host certificate” in Burp Proxy. As discussed above, you have to explicitly put in the hostname that it’s connecting to. If you don’t know the host that it’s connecting to over SSL, you’re going to have to either sniff the connection passively using a packet capture tool (Hint: check out DNS requests), or reverse the app and look for the host names inside the code.  If you have an app that is making connections to different SSL hosts, you’re going to have to setup separate listeners. Here I’m going to MiTM the connections to instagram.com.
If you’re successful, when you log into Instagram, you’ll get the traffic to  show up.
Hurray! You’ve MiTM’d an Android app and now you can watch the traffic during an SSL session. Once you’ve gone through the setup once, it’ll take less than 5 minutes to setup again without any extra hardware besides sharing a wireless network.
Now you can intercept all Hipster Dog related traffic for analysis. Thanks rachelclee33 and bertmb for the pic.
Both comments and trackbacks are currently closed.