diff --git a/docs/README.md b/docs/README.md new file mode 100755 index 0000000..e69de29 diff --git a/docs/icons/PythonPowered.png b/docs/icons/PythonPowered.png new file mode 100755 index 0000000..2e9d99c Binary files /dev/null and b/docs/icons/PythonPowered.png differ diff --git a/docs/icons/gnu-head-tiny.jpg b/docs/icons/gnu-head-tiny.jpg new file mode 100755 index 0000000..441be50 Binary files /dev/null and b/docs/icons/gnu-head-tiny.jpg differ diff --git a/docs/icons/mailman.jpg b/docs/icons/mailman.jpg new file mode 100755 index 0000000..94a4c01 Binary files /dev/null and b/docs/icons/mailman.jpg differ diff --git a/docs/icons/mm-icon.png b/docs/icons/mm-icon.png new file mode 100755 index 0000000..42c3cf7 Binary files /dev/null and b/docs/icons/mm-icon.png differ diff --git a/docs/index.html b/docs/index.html new file mode 100755 index 0000000..dff3cb9 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,230 @@ + + + + + + + + + + + + Portspoof - A new approach to fight back port and service scanners. + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+   + +
+ +

About Portspoof

+
+ +

The Portspoof program primary goal is to enhance your systems security through a set of new camouflage techniques. As a result of applying them your attackers' port scan result will become entirely mangled and to very significant extent meaningless.

+Techniques used to achieve this: +

+ +
  • + All configured TCP ports are always open +
+ +

Instead of informing an attacker that a particular port is in a CLOSED or FILTERED state a system running Portspoof will return SYN+ACK for every connection attempt.

+ +

Result: As a result it is impractical to use stealth (SYN, ACK, etc.) port scanning against your system, since all ports are always reported as OPEN. + With this approach it is really difficult to determine if a valid software is listening on a particular port (check out the screenshots).

+
  • + Every open TCP port emulates a valid services +
+ +

Portspoof has a huge dynamic service signature database, that will be used to generate responses to your offenders scanning software service probes.

+ +

Scanning software usually tries to determine a service that is running on an open port. This step is mandatory if one would want to identify port numbers on which you are running your services on a system behind the Portspoof. + For this reason Portspoof will respond to every service probe with a valid service signature, that is dynamically generated based on a service signature regular expression database.

+

Result: As a result an attacker will not be able to determine which port numbers your system is truly using.

+ +
Reverse exploitation with Portspoof:
+

Portspoof can be used as an 'Exploitation Framework Frontend', that turns your system into responsive and aggressive machine. In practice this usually means exploiting your attackers' tools and exploits.

+

At the moment there are few example exploits in the configuration file (portspoof.conf). One of them exploits Nmap 6.25 default script.

+ +
Overview:
+ +

Portspoof is meant to be a lightweight, fast, portable and secure addition to the any firewall system or security system. +The general goal of the program is to make the reconessaince phase slow and bothersome for your attackers as much it is only possible. +This is quite a change to the standard 5s Nmap scan, that will give a full view of your systems running services.

+ +

By using all of the above mentioned techniques together:
+

    +
  • your attackers will have a tough time while trying to identify all of your listening services.
  • +
  • the only way to determine if a service is emulated is through a protocol probe (imagine probing protocols for 65k open ports!).
  • +
  • it takes more than 8 hours and 200MB of sent data in order to get all of the service banners for your system ( nmap -sV -p - equivalent).
  • +
+ + +
+
+

Screenshots

+

Nmap port scan results for TCP ports 1:65353 (only one service is real):

+ +
+ +
+

Videos

+
+

Nmap scan against system protected by Portspoof:

+ +

+

Exploiting your attackers automated exploit scripts with Portspoof:

+ +

+

Exploiting your attackers Nmap NSE script with Portspoof:

+ +

+ +
+ +
+
+

Features

+

The most important features that Portspoof has:

+

+- Portspoof is a userland software and does not require root privileges !
+- Binds to just one tcp port per a running instance
+- Easily customizable through your iptables rules
+- Marginal CPU/memory usage (multithreaded)
+- More than 9000 dynamic service signatures are supported !
+

+Check out the documentation page for further details. +

+
+ + +
+

Log

+
+

For full log details please visit https://github.com/drk1wi/portspoof

+

+ +1.1 - 1/01/2014 - Linux
+* Minor release.
+* Updated reverse regular expression generation engine (used for generting bogus service signatures).
+* Over 9000 service signatures in the portspoof_signatures file..
+* Better memory management.
+
+1.0 - 02/08/2013 - Linux
+* Major release.
+* Ported to C++.
+* Example NMAP NSE exploit, McAffe UTF7 XSS, etc. exploits added .
+* Fuzzer functionality added.
+* Many minor improvements and enhancements have been made
+
+0.3 - 28/09/2012 - Linux
+* Configuration file support.
+* Minor bug fixes and improvements.
+* Droppped BSD support due to time constraints (will resume in future - maybe).
+* 8000 port signatures supported
+
+0.2 - 11/08/2012 - Linux/BSD
+Note: BSD implementation is still experimental
+* Alerts can be logged for further investigation.
+* Fixed BSD startup bug.
+* Automake files fixed.
+* Other minor bugs fixed.
+
+0.1 - 02/08/2012 - Linux/BSD
+* First stable release for Linux.
+* Multithreaded.
+* 1866 port signatures supported.
+

+
+ +
+
+

License

+

Portspoof is a free software distributed under GNU GPL version 2 license.

All the relevant details can be found here

+ +   + +
+
+
+

Support

+

If you like Portspoof and would like to support this project then please aid me with a cup of coffee :)

+
+ + + + +
+ +
+
+

Portspoof - Piotr [at] Duszynski.eu PGP key @2012 All rights reserved

+ +
+ +
+ + + diff --git a/docs/media/favicon.ico b/docs/media/favicon.ico new file mode 100755 index 0000000..1d9202f Binary files /dev/null and b/docs/media/favicon.ico differ diff --git a/docs/media/nmap_scan.jpg b/docs/media/nmap_scan.jpg new file mode 100755 index 0000000..5d22bb6 Binary files /dev/null and b/docs/media/nmap_scan.jpg differ diff --git a/docs/media/pduszynski.asc b/docs/media/pduszynski.asc new file mode 100755 index 0000000..3b3ba39 --- /dev/null +++ b/docs/media/pduszynski.asc @@ -0,0 +1,30 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: STS + +mQENBE5lNcoBCADbTBgNDtK8VH+ewaJJAqk7d1r/AeV8rsBNueHFctHFtqMbJ6Dt +Pw4JHzOBw8naycmVlJN0DNChGoO9uSNfCQ0Y3h3gEraK/uuBwOTy7krgmHEHd5u6 +ttqp3PmVcjlPq03FDBkmkpWM56WvFwtNpY4wL2ImFRSbkdiKLb2us0xOZrbybZMs +z59Jlkk8aksfqWhEM1lDECNhPuJrJ8n+XC8om8IkXiW7OeIlKMmRot2jpVwpA3Aw +iYYZa1PxGgrDbiaP/ypS6hcIk0JeX1oNNwEpvusnGlRnkS3cNmDfJhb81v9aQ/z2 +qPuJS7WYwZiev2F0v7AWEAkio+pHTPuaKcTTABEBAAG0JFBpb3RyIER1c3p5bnNr +aSA8cGlvdHJAZHVzenluc2tpLmV1PokBPgQTAQIAKAUCTmU1ygIbIwUJCWYBgAYL +CQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQclh0luzNNvPwOQf/dBnvtCMHcLZ0 +AqRipwx5NvZzjVeLepZCiKs9Ck58CInnWSrM9QbIxQlxFNklJZ++w6VbDr8p+o3R +15K1XMsm/U5Nx6ZMws2NdeHujQPHml3hJGeB/IsBdZ0MUdmvDdkCYFmSFv1N6KPt +jzkItUbgvNv8AiXHLyXbNX/zv3kw9txB34+c2YtkWJ407jfgRf2ElSVtYuDJzf7c +ZwRoBSTpeQ4tXadTiweyHsX1qyTZsGdmjNGvr5rLKgxtysNF+m0yM+jmQBW3w0Ln +mjZQyLyeryM7JKtQ3zpV7St4LyJcY6VVmdFWFRHScpIzzKiQ7yaILOQ/dumLhZMD +vh7y/9J4NrkBDQROZTXKAQgAogLXYeR0NVjy+qMqo3S6ZCTPryawZtyarDlG/sW+ +4KfJvS7g0dKTeWPTzZzC9u2duqKlTw4JCXiJ0V1VJfoYjJe5jrgF+s37L+YXptRm +pNHmQBMtH3TJakQWyFRnlRdxiNUTg9UKxR3ETneBMvo96IIsf2I8oqaW+5fNBr+Q +ZmJDuViWIGxdJtI7KiorqZ3kZDhz6KBf/Is5yhCaYkLTMke0tsEFkeYXwt0G4AxA +RJvo3+4j9COxuiTw/W17WkTFxl/4ofj/WDuW7+gYkL1TWo2a1iMnkPve8AR+zSAz +l1vMqdBDymEe7+sMeL9DwqU4dflKpa0FOtGg9Y8ODolzfQARAQABiQElBBgBAgAP +BQJOZTXKAhsMBQkJZgGAAAoJEHJYdJbszTbzg5wH/045rrFEzaRloT5Q+vcy1byA +GUK2fdgRDgj2oU8THBSyRgW/uPsEG0gwlAW8IMps6Dw4rESZrGIAF9ChdQyScwS7 +ue3qkkBOqn33azGgiGnmtiZkCQegVqcKZ6L5TlWfaXEn7nI85jRjhCJUM4NgDADz +X9WMXGNCsFPMIKyTmws4raR9Qg6P4rnNrb1PeWNo02JQHVWoLQLTrw4tG8wQ3AjU +7OUiOukBXJdR2vRa/H2xk+T0Sa0d+8B4P5TRUrrkI79yomzL2H6o+g0LB7RIsbzI +xg2pGGUjJhf+Y4sqG/UmprGfrVqvBgMjsXPj+IrtCxmWfTZumuGsBMfYzcV9MME= +=T912 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/docs/stylesheets/base.css b/docs/stylesheets/base.css new file mode 100755 index 0000000..9ae0270 --- /dev/null +++ b/docs/stylesheets/base.css @@ -0,0 +1,269 @@ +/* +* Skeleton V1.2 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 6/20/2012 +*/ + + +/* Table of Content +================================================== + #Reset & Basics + #Basic Styles + #Site Styles + #Typography + #Links + #Lists + #Images + #Buttons + #Forms + #Misc */ + + +/* #Reset & Basics (Inspired by E. Meyers) +================================================== */ + html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; } + article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; } + body { + line-height: 1; } + ol, ul { + list-style: none; } + blockquote, q { + quotes: none; } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; } + table { + border-collapse: collapse; + border-spacing: 0; } + + +/* #Basic Styles +================================================== */ + body { + background: #fff; + font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #444; + -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ + -webkit-text-size-adjust: 100%; + } + + +/* #Typography +================================================== */ + h1, h2, h3, h4, h5, h6 { + color: #181818; + font-family: "Georgia", "Times New Roman", serif; + font-weight: normal; } + h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } + h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;} + h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } + h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } + h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } + h5 { font-size: 17px; line-height: 24px; } + h6 { font-size: 14px; line-height: 21px; } + .subheader { color: #777; } + + p { margin: 0 0 20px 0; } + p img { margin: 0; } + p.lead { font-size: 21px; line-height: 27px; color: #777; } + + em { font-style: italic; } + strong { font-weight: bold; color: #333; } + small { font-size: 80%; } + +/* Blockquotes */ + blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } + blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; } + blockquote cite { display: block; font-size: 12px; color: #555; } + blockquote cite:before { content: "\2014 \0020"; } + blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; } + + hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } + + +/* #Links +================================================== */ + a, a:visited { color: #333; text-decoration: underline; outline: 0; } + a:hover, a:focus { color: #000; } + p a, p a:visited { line-height: inherit; } + + +/* #Lists +================================================== */ + ul, ol { margin-bottom: 20px; } + ul { list-style: none outside; } + ol { list-style: decimal; } + ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } + ul.square { list-style: square outside; } + ul.circle { list-style: circle outside; } + ul.disc { list-style: disc outside; } + ul ul, ul ol, + ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } + ul ul li, ul ol li, + ol ol li, ol ul li { margin-bottom: 6px; } + li { line-height: 18px; margin-bottom: 12px; } + ul.large li { line-height: 21px; } + li p { line-height: 21px; } + +/* #Images +================================================== */ + + img.scale-with-grid { + max-width: 100%; + height: auto; } + + +/* #Buttons +================================================== */ + + .button, + button, + input[type="submit"], + input[type="reset"], + input[type="button"] { + background: #eee; /* Old browsers */ + background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ + background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ + background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ + background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ + background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ + background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ + border: 1px solid #aaa; + border-top: 1px solid #ccc; + border-left: 1px solid #ccc; + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + color: #444; + display: inline-block; + font-size: 11px; + font-weight: bold; + text-decoration: none; + text-shadow: 0 1px rgba(255, 255, 255, .75); + cursor: pointer; + margin-bottom: 20px; + line-height: normal; + padding: 8px 10px; + font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } + + .button:hover, + button:hover, + input[type="submit"]:hover, + input[type="reset"]:hover, + input[type="button"]:hover { + color: #222; + background: #ddd; /* Old browsers */ + background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ + background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ + background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ + background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ + background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ + background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ + border: 1px solid #888; + border-top: 1px solid #aaa; + border-left: 1px solid #aaa; } + + .button:active, + button:active, + input[type="submit"]:active, + input[type="reset"]:active, + input[type="button"]:active { + border: 1px solid #666; + background: #ccc; /* Old browsers */ + background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ + background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ + background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ + background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ + background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ + background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } + + .button.full-width, + button.full-width, + input[type="submit"].full-width, + input[type="reset"].full-width, + input[type="button"].full-width { + width: 100%; + padding-left: 0 !important; + padding-right: 0 !important; + text-align: center; } + + /* Fix for odd Mozilla border & padding issues */ + button::-moz-focus-inner, + input::-moz-focus-inner { + border: 0; + padding: 0; + } + + +/* #Forms +================================================== */ + + form { + margin-bottom: 20px; } + fieldset { + margin-bottom: 20px; } + input[type="text"], + input[type="password"], + input[type="email"], + textarea, + select { + border: 1px solid #ccc; + padding: 6px 4px; + outline: none; + -moz-border-radius: 2px; + -webkit-border-radius: 2px; + border-radius: 2px; + font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #777; + margin: 0; + width: 210px; + max-width: 100%; + display: block; + margin-bottom: 20px; + background: #fff; } + select { + padding: 0; } + input[type="text"]:focus, + input[type="password"]:focus, + input[type="email"]:focus, + textarea:focus { + border: 1px solid #aaa; + color: #444; + -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); + -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); + box-shadow: 0 0 3px rgba(0,0,0,.2); } + textarea { + min-height: 60px; } + label, + legend { + display: block; + font-weight: bold; + font-size: 13px; } + select { + width: 220px; } + input[type="checkbox"] { + display: inline; } + label span, + legend span { + font-weight: normal; + font-size: 13px; + color: #444; } + +/* #Misc +================================================== */ + .remove-bottom { margin-bottom: 0 !important; } + .half-bottom { margin-bottom: 10px !important; } + .add-bottom { margin-bottom: 20px !important; } + + diff --git a/docs/stylesheets/custom.css b/docs/stylesheets/custom.css new file mode 100755 index 0000000..c218a6e --- /dev/null +++ b/docs/stylesheets/custom.css @@ -0,0 +1,49 @@ +.container .navbar { + + border-top: solid 1px #CCCCCC; + color: #808080; + background:#355568; + height: 48px; + + +} + +.container .navlinks{ + + margin-top: 5px; + background: white; + border-bottom: solid 1px #CCCCCC; + +} + +.container .navbar h1 { + + text-decoration: none; + color: white; + font-weight: normal + +} + +.container .navlinks ul { + list-style: none; + margin: 0px 0px 0px 0px; + padding-right: 5px; + text-align:right; + +} +.container .navlinks ul li { + display: inline; + font-size: 18px; + padding-right: 5px; +} +.container .navlinks ul li a { + padding-left: 5px; + text-decoration: none; + color: black; + font-weight: normal; + +} +.container .navlinks ul li a:hover { + color: grey; + +} diff --git a/docs/stylesheets/layout.css b/docs/stylesheets/layout.css new file mode 100755 index 0000000..b99f451 --- /dev/null +++ b/docs/stylesheets/layout.css @@ -0,0 +1,58 @@ +/* +* Skeleton V1.2 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 6/20/2012 +*/ + +/* Table of Content +================================================== + #Site Styles + #Page Styles + #Media Queries + #Font-Face */ + +/* #Site Styles +================================================== */ + +/* #Page Styles +================================================== */ + +/* #Media Queries +================================================== */ + + /* Smaller than standard 960 (devices and browsers) */ + @media only screen and (max-width: 959px) {} + + /* Tablet Portrait size to standard 960 (devices and browsers) */ + @media only screen and (min-width: 768px) and (max-width: 959px) {} + + /* All Mobile Sizes (devices and browser) */ + @media only screen and (max-width: 767px) {} + + /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ + @media only screen and (min-width: 480px) and (max-width: 767px) {} + + /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ + @media only screen and (max-width: 479px) {} + + +/* #Font-Face +================================================== */ +/* This is the proper syntax for an @font-face file + Just create a "fonts" folder at the root, + copy your FontName into code below and remove + comment brackets */ + +/* @font-face { + font-family: 'FontName'; + src: url('../fonts/FontName.eot'); + src: url('../fonts/FontName.eot?iefix') format('eot'), + url('../fonts/FontName.woff') format('woff'), + url('../fonts/FontName.ttf') format('truetype'), + url('../fonts/FontName.svg#webfontZam02nTh') format('svg'); + font-weight: normal; + font-style: normal; } +*/ \ No newline at end of file diff --git a/docs/stylesheets/skeleton.css b/docs/stylesheets/skeleton.css new file mode 100755 index 0000000..5db3d38 --- /dev/null +++ b/docs/stylesheets/skeleton.css @@ -0,0 +1,242 @@ +/* +* Skeleton V1.2 +* Copyright 2011, Dave Gamache +* www.getskeleton.com +* Free to use under the MIT license. +* http://www.opensource.org/licenses/mit-license.php +* 6/20/2012 +*/ + + +/* Table of Contents +================================================== + #Base 960 Grid + #Tablet (Portrait) + #Mobile (Portrait) + #Mobile (Landscape) + #Clearing */ + + + +/* #Base 960 Grid +================================================== */ + + .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } + .container .column, + .container .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } + .row { margin-bottom: 20px; } + + /* Nested Column Classes */ + .column.alpha, .columns.alpha { margin-left: 0; } + .column.omega, .columns.omega { margin-right: 0; } + + /* Base Grid */ + .container .one.column, + .container .one.columns { width: 40px; } + .container .two.columns { width: 100px; } + .container .three.columns { width: 160px; } + .container .four.columns { width: 220px; } + .container .five.columns { width: 280px; } + .container .six.columns { width: 340px; } + .container .seven.columns { width: 400px; } + .container .eight.columns { width: 460px; } + .container .nine.columns { width: 520px; } + .container .ten.columns { width: 580px; } + .container .eleven.columns { width: 640px; } + .container .twelve.columns { width: 700px; } + .container .thirteen.columns { width: 760px; } + .container .fourteen.columns { width: 820px; } + .container .fifteen.columns { width: 880px; } + .container .sixteen.columns { width: 940px; } + + .container .one-third.column { width: 300px; } + .container .two-thirds.column { width: 620px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 60px; } + .container .offset-by-two { padding-left: 120px; } + .container .offset-by-three { padding-left: 180px; } + .container .offset-by-four { padding-left: 240px; } + .container .offset-by-five { padding-left: 300px; } + .container .offset-by-six { padding-left: 360px; } + .container .offset-by-seven { padding-left: 420px; } + .container .offset-by-eight { padding-left: 480px; } + .container .offset-by-nine { padding-left: 540px; } + .container .offset-by-ten { padding-left: 600px; } + .container .offset-by-eleven { padding-left: 660px; } + .container .offset-by-twelve { padding-left: 720px; } + .container .offset-by-thirteen { padding-left: 780px; } + .container .offset-by-fourteen { padding-left: 840px; } + .container .offset-by-fifteen { padding-left: 900px; } + + + +/* #Tablet (Portrait) +================================================== */ + + /* Note: Design for a width of 768px */ + + @media only screen and (min-width: 768px) and (max-width: 959px) { + .container { width: 768px; } + .container .column, + .container .columns { margin-left: 10px; margin-right: 10px; } + .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } + .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } + .alpha.omega { margin-left: 0; margin-right: 0; } + + .container .one.column, + .container .one.columns { width: 28px; } + .container .two.columns { width: 76px; } + .container .three.columns { width: 124px; } + .container .four.columns { width: 172px; } + .container .five.columns { width: 220px; } + .container .six.columns { width: 268px; } + .container .seven.columns { width: 316px; } + .container .eight.columns { width: 364px; } + .container .nine.columns { width: 412px; } + .container .ten.columns { width: 460px; } + .container .eleven.columns { width: 508px; } + .container .twelve.columns { width: 556px; } + .container .thirteen.columns { width: 604px; } + .container .fourteen.columns { width: 652px; } + .container .fifteen.columns { width: 700px; } + .container .sixteen.columns { width: 748px; } + + .container .one-third.column { width: 236px; } + .container .two-thirds.column { width: 492px; } + + /* Offsets */ + .container .offset-by-one { padding-left: 48px; } + .container .offset-by-two { padding-left: 96px; } + .container .offset-by-three { padding-left: 144px; } + .container .offset-by-four { padding-left: 192px; } + .container .offset-by-five { padding-left: 240px; } + .container .offset-by-six { padding-left: 288px; } + .container .offset-by-seven { padding-left: 336px; } + .container .offset-by-eight { padding-left: 384px; } + .container .offset-by-nine { padding-left: 432px; } + .container .offset-by-ten { padding-left: 480px; } + .container .offset-by-eleven { padding-left: 528px; } + .container .offset-by-twelve { padding-left: 576px; } + .container .offset-by-thirteen { padding-left: 624px; } + .container .offset-by-fourteen { padding-left: 672px; } + .container .offset-by-fifteen { padding-left: 720px; } + } + + +/* #Mobile (Portrait) +================================================== */ + + /* Note: Design for a width of 320px */ + + @media only screen and (max-width: 767px) { + .container { width: 300px; } + .container .columns, + .container .column { margin: 0; } + + .container .one.column, + .container .one.columns, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 300px; } + + /* Offsets */ + .container .offset-by-one, + .container .offset-by-two, + .container .offset-by-three, + .container .offset-by-four, + .container .offset-by-five, + .container .offset-by-six, + .container .offset-by-seven, + .container .offset-by-eight, + .container .offset-by-nine, + .container .offset-by-ten, + .container .offset-by-eleven, + .container .offset-by-twelve, + .container .offset-by-thirteen, + .container .offset-by-fourteen, + .container .offset-by-fifteen { padding-left: 0; } + + } + + +/* #Mobile (Landscape) +================================================== */ + + /* Note: Design for a width of 480px */ + + @media only screen and (min-width: 480px) and (max-width: 767px) { + .container { width: 420px; } + .container .columns, + .container .column { margin: 0; } + + .container .one.column, + .container .one.columns, + .container .two.columns, + .container .three.columns, + .container .four.columns, + .container .five.columns, + .container .six.columns, + .container .seven.columns, + .container .eight.columns, + .container .nine.columns, + .container .ten.columns, + .container .eleven.columns, + .container .twelve.columns, + .container .thirteen.columns, + .container .fourteen.columns, + .container .fifteen.columns, + .container .sixteen.columns, + .container .one-third.column, + .container .two-thirds.column { width: 420px; } + } + + +/* #Clearing +================================================== */ + + /* Self Clearing Goodness */ + .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } + + /* Use clearfix class on parent to clear nested columns, + or wrap each row of columns in a
*/ + .clearfix:before, + .clearfix:after, + .row:before, + .row:after { + content: '\0020'; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; } + .row:after, + .clearfix:after { + clear: both; } + .row, + .clearfix { + zoom: 1; } + + /* You can also use a
to clear columns */ + .clear { + clear: both; + display: block; + overflow: hidden; + visibility: hidden; + width: 0; + height: 0; + }