Split readme to landing page + license

Make font even across pages
This commit is contained in:
Itay Mizeretz 2017-10-17 14:47:33 +03:00
parent 786993429e
commit 5121a4fe54
11 changed files with 34 additions and 172 deletions

View File

@ -64,11 +64,8 @@
"bootstrap": "^3.3.7", "bootstrap": "^3.3.7",
"core-js": "^2.5.1", "core-js": "^2.5.1",
"fetch": "^1.1.0", "fetch": "^1.1.0",
"github-markdown-css": "^2.8.0",
"marked": "^0.3.6",
"normalize.css": "^4.0.0", "normalize.css": "^4.0.0",
"prop-types": "^15.5.10", "prop-types": "^15.5.10",
"raw-loader": "^0.5.1",
"react": "^15.6.1", "react": "^15.6.1",
"react-bootstrap": "^0.31.2", "react-bootstrap": "^0.31.2",
"react-copy-to-clipboard": "^5.0.0", "react-copy-to-clipboard": "^5.0.0",

View File

@ -10,7 +10,7 @@ import MapPage from 'components/pages/MapPage';
import TelemetryPage from 'components/pages/TelemetryPage'; import TelemetryPage from 'components/pages/TelemetryPage';
import StartOverPage from 'components/pages/StartOverPage'; import StartOverPage from 'components/pages/StartOverPage';
import ReportPage from 'components/pages/ReportPage'; import ReportPage from 'components/pages/ReportPage';
import ReadMePage from 'components/pages/ReadMePage'; import LicensePage from 'components/pages/LicensePage';
require('normalize.css/normalize.css'); require('normalize.css/normalize.css');
require('react-data-components/css/table-twbs.css'); require('react-data-components/css/table-twbs.css');
@ -116,17 +116,18 @@ class AppComponent extends React.Component {
<ul> <ul>
<li><NavLink to="/configure">Configuration</NavLink></li> <li><NavLink to="/configure">Configuration</NavLink></li>
<li><NavLink to="/infection/telemetry">Monkey Telemetry</NavLink></li> <li><NavLink to="/infection/telemetry">Monkey Telemetry</NavLink></li>
<li><NavLink to="/readme">Read Me</NavLink></li>
</ul> </ul>
<hr/> <hr/>
<div className="guardicore-link text-center"> <div className="guardicore-link text-center" style={{'marginBottom': '0.5em'}}>
<span>Powered by</span> <span>Powered by</span>
<a href="http://www.guardicore.com" target="_blank"> <a href="http://www.guardicore.com" target="_blank">
<img src={guardicoreLogoImage} alt="GuardiCore"/> <img src={guardicoreLogoImage} alt="GuardiCore"/>
</a> </a>
</div> </div>
<div className="license-link text-center">
<NavLink to="/license">License</NavLink>
</div>
</Col> </Col>
<Col sm={9} md={10} smOffset={3} mdOffset={2} className="main"> <Col sm={9} md={10} smOffset={3} mdOffset={2} className="main">
<Route exact path="/" render={(props) => ( <RunServerPage onStatusChange={this.updateStatus} /> )} /> <Route exact path="/" render={(props) => ( <RunServerPage onStatusChange={this.updateStatus} /> )} />
@ -136,7 +137,7 @@ class AppComponent extends React.Component {
<Route path="/infection/telemetry" render={(props) => ( <TelemetryPage onStatusChange={this.updateStatus} /> )} /> <Route path="/infection/telemetry" render={(props) => ( <TelemetryPage onStatusChange={this.updateStatus} /> )} />
<Route path="/start-over" render={(props) => ( <StartOverPage onStatusChange={this.updateStatus} /> )} /> <Route path="/start-over" render={(props) => ( <StartOverPage onStatusChange={this.updateStatus} /> )} />
<Route path="/report" render={(props) => ( <ReportPage onStatusChange={this.updateStatus} /> )} /> <Route path="/report" render={(props) => ( <ReportPage onStatusChange={this.updateStatus} /> )} />
<Route path="/readme" render={(props) => ( <ReadMePage onStatusChange={this.updateStatus} /> )} /> <Route path="/license" render={(props) => ( <LicensePage onStatusChange={this.updateStatus} /> )} />
</Col> </Col>
</Row> </Row>
</Grid> </Grid>

View File

@ -1,28 +1,9 @@
import React from 'react'; import React from 'react';
import {Col, Nav, NavItem} from 'react-bootstrap'; import {Col} from 'react-bootstrap';
var marked = require('marked');
var aboutDoc = require('raw!../../readme/About.md'); class LicensePageComponent extends React.Component {
var usageDoc = require('raw!../../readme/Usage.md');
var howItWorksDoc = require('raw!../../readme/HowItWorks.md');
var licenseDoc = require('raw!../../readme/License.md');
class ReadMePageComponent extends React.Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.sectionKeys = ['about', 'howItWorks', 'usage', 'license'];
this.sections =
{
about: {title: 'About', data: aboutDoc},
usage: {title: 'Usage', data: usageDoc},
howItWorks: {title: 'How It Works', data: howItWorksDoc},
license: {title: 'License', data: licenseDoc}
};
this.state = {
selectedSection: this.sectionKeys[0]
}
} }
setSelectedSection = (key) => { setSelectedSection = (key) => {
@ -32,22 +13,21 @@ class ReadMePageComponent extends React.Component {
}; };
render() { render() {
return ( return (
<Col xs={12} lg={8}> <Col xs={12} lg={8}>
<h1 className="page-title">Read Me</h1> <h1 className="page-title">License</h1>
<Nav bsStyle="tabs" justified <div style={{'fontSize': '1.2em'}}>
activeKey={this.state.selectedSection} onSelect={this.setSelectedSection} <p>
style={{'marginBottom': '2em'}}> Copyright <i className="glyphicon glyphicon-copyright-mark" /> 2017 Guardicore Ltd.
{this.sectionKeys.map(section => Licensed under <a href="https://www.gnu.org/licenses/gpl-3.0.html" target="_blank">GPLv3</a>.
<NavItem key={section} eventKey={section}>{this.sections[section].title}</NavItem> </p>
)} <p>
</Nav> The source code is available on <a href="https://github.com/guardicore/monkey" target="_blank">GitHub</a>
<div dangerouslySetInnerHTML={{__html: marked(this.sections[this.state.selectedSection].data)}} className="markdown-body"> </p>
</div> </div>
</Col> </Col>
); );
} }
} }
export default ReadMePageComponent; export default LicensePageComponent;

View File

@ -10,7 +10,7 @@ class ReportPageComponent extends React.Component {
return ( return (
<Col xs={12} lg={8}> <Col xs={12} lg={8}>
<h1 className="page-title">Penetration Test Report</h1> <h1 className="page-title">Penetration Test Report</h1>
<div style={{'fontSize': '1.5em'}}> <div style={{'fontSize': '1.2em'}}>
<p> <p>
Under construction Under construction
</p> </p>

View File

@ -139,6 +139,7 @@ class RunMonkeyPageComponent extends React.Component {
<h1 className="page-title">Run the Monkey</h1> <h1 className="page-title">Run the Monkey</h1>
<p style={{'marginBottom': '2em', 'fontSize': '1.2em'}}> <p style={{'marginBottom': '2em', 'fontSize': '1.2em'}}>
Go ahead and run the monkey! Go ahead and run the monkey!
<i> (Or make further adjustments by <Link to="/configure">configuring the monkey</Link>)</i>
</p> </p>
<p> <p>
<button onClick={this.runLocalMonkey} <button onClick={this.runLocalMonkey}

View File

@ -18,14 +18,18 @@ class RunServerPageComponent extends React.Component {
return ( return (
<Col xs={12} lg={8}> <Col xs={12} lg={8}>
<h1 className="page-title">Monkey Island C&C Server</h1> <h1 className="page-title">Monkey Island C&C Server</h1>
<div style={{'fontSize': '1.5em'}}> <div style={{'fontSize': '1.2em'}}>
<p>Your Monkey Island server is up and running on <b>{this.state.ip}</b> &#x1F44F; &#x1F44F;</p> <p style={{'marginTop': '30px'}}>Congrats! You have successfully set up the Monkey Island server. &#x1F44F; &#x1F44F;</p>
<p>
The Infection Monkey is an open source security tool for testing a data center's resiliency to perimeter
breaches and internal server infection.
The Monkey uses various methods to self propagate across a data
center and reports success to a centralized C&C server.
To read more about the Monkey, visit <a href="http://infectionmonkey.com" target="_blank">infectionmonkey.com</a>
</p>
<p> <p>
Go ahead and <Link to="/run-monkey">run the monkey</Link>. Go ahead and <Link to="/run-monkey">run the monkey</Link>.
</p> </p>
<p style={{'marginTop': '30px'}}>
<i>(You can make further adjustments by <Link to="/configure">configuring the monkey</Link>)</i>
</p>
</div> </div>
</Col> </Col>
); );

View File

@ -1,30 +0,0 @@
About
=======
Welcome to the Infection Monkey!
The Infection Monkey is an open source security tool for testing a data center's resiliency to perimeter breaches and internal server infection. The Monkey uses various methods to self propagate across a data center and reports success to a centralized C&C server. To read more about the Monkey, visit https://www.infectionmonkey.com
Features include:
* Multiple propagation techniques:
* Predefined passwords
* Common exploits
* Password stealing using mimikatz
* Multiple exploit methods:
* SSH
* SMB
* RDP
* WMI
* Shellshock
* SambaCry
* Elastic Search
* A C&C server with a dedicated UI to visualize the Monkey's progress inside the data center
The Infection Monkey is comprised of two parts: the Monkey and the C&C server.
The monkey is the tool which infects other machines and propagates to them, while the C&C server collects all Monkey reports and displays them to the user.
Building the Monkey from source
-------------------------------
If you want to build the monkey from source instead of using our provided packages, follow the instructions at the readme files under [chaos_monkey](chaos_monkey) and [monkey_island](monkey_island).

View File

@ -1,41 +0,0 @@
How It Works
=======
Whether you're downloading or building the Monkey from source, the Infection Monkey is comprised of 4 executable files for different platforms plus a default configuration file.
Monkey configuration is stored in two places:
1. By default, the Monkey uses a local configuration file (usually, config.bin). This configuration file must include the address of the Monkey's C&C server.
2. After successfully connecting to the C&C server, the monkey downloads a new configuration from the server and discards the local configuration. It is possible to change the default configuration from the C&C server's UI.
In both cases the command server hostname should be modified to point to your local instance of the Monkey Island (note that this doesn't require connectivity right off the bat). In addition, to improve the Monkey's chances of spreading, you can pre-seed it with credentials and usernames commonly used.
Both configuration options use a JSON format for specifying options; see "Options" below for details.
How the Monkey works
---------------------
1. Wakeup connection to c&c, sends basic info of the current machine and the configuration the monkey uses to the c&c.
1. First try direct connection to c&c.
2. If direct connection fails, try connection through a tunnel, a tunnel is found according to specified parameter (the default tunnel) or by sending a multicast query and waiting for another monkey to answer.
3. If no connection can be made to c&c, continue without it.
2. If a firewall app is running on the machine (supports Windows Firewall for Win XP and Windows Advanced Firewall for Win 7+), try to add a rule to allow all our traffic.
3. Startup of tunnel for other Monkeys (if connection to c&c works).
1. Firewall is checked to allow listening sockets (if we failed to add a rule to Windows firewall for example, the tunnel will not be created)
2. Will answer multicast requests from other Monkeys in search of a tunnel.
4. Running exploitation sessions, will run x sessions according to configuration:
1. Connect to c&c and get the latest configuration
2. Scan ip ranges according to configuration.
3. Try fingerprinting each host that answers, using the classes defined in the configuration (SMBFinger, SSHFinger, etc)
4. Try exploitation on each host found, for each exploit class in configuration:
1. check exploit class supports target host (can be disabled by configuration)
2. each exploitation class will use the data acquired in fingerprinting, or during the exploit, to find the suitable Monkey executable for the host from the c&c.
1. If c&c connection fails, and the source monkeys executable is suitable, we use it.
2. If a suitable executable isnt found, exploitation will fail.
3. Executables are cached in memory.
5. will skip hosts that are already exploited in next run
6. will skip hosts that failed during exploitation in next run (can be disabled by configuration)
5. Close tunnel before exiting
Wait for monkeys using the tunnel to unregister for it
Cleanup
Remove firewall rules if added

View File

@ -1,45 +0,0 @@
License
=======
Copyright (c) 2016 Guardicore Ltd
See the [LICENSE](LICENSE) file for license rights and limitations (GPLv3).
Dependent packages
---------------------
Dependency | License | Notes
----------------------------|----------------------------|----------------------------
libffi-dev | https://github.com/atgreen/libffi/blob/master/LICENSE
PyCrypto | Public domain
upx | Custom license, http://upx.sourceforge.net/upx-license.html
bson | BSD
enum34 | BSD
pyasn1 | BSD
psutil | BSD
flask | BSD
flask-Pymongo | BSD
Flask-Restful | BSD
python-dateutil | Simplified BSD
zope | ZPL 2.1
Bootstrap | MIT
Bootstrap Switch | Apache 2.0
Bootstrap Dialog | MIT
JSON Editor | MIT
Datatables | MIT
jQuery | MIT
cffi | MIT
twisted | MIT
typeahead.js | MIT
Font Awesome | MIT
vis.js | MIT/Apache 2.0
impacket | Apache Modified
Start Bootstrap (UI Theme) | Apache 2.0
requests | Apache 2.0
grequests | BSD
odict | Python Software Foundation License
paramiko | LGPL
rdpy | GPL-3
winbind | GPL-3
pyinstaller | GPL
Celery | BSD
mimikatz | CC BY 4.0 | We use an altered version of mimikatz made by gentilkiwi: https://github.com/guardicore/mimikatz

View File

@ -1,10 +0,0 @@
Usage
=======
Once configured, run the monkey using ```./monkey-linux-64 m0nk3y -c config.bin -s 41.50.73.31:5000``` (Windows is identical). This can be done at multiple points in the network simultaneously.
Command line options include:
* `-c`, `--config`: set configuration file. JSON file with configuration values, will override compiled configuration.
* `-p`, `--parent`: set monkeys parent uuid, allows better recognition of exploited monkeys in c&c
* `-t`, `--tunnel`: ip:port, set default tunnel for Monkey when connecting to c&c.
* `-d`, `--depth` : sets the Monkey's current operation depth.

View File

@ -341,6 +341,11 @@ body {
width: 100px; width: 100px;
} }
.license-link a:link, .license-link a:visited {
color: #797979 !important;
font-size: 0.9em;
}
.data-table-container .pagination { .data-table-container .pagination {
margin: 0 !important; margin: 0 !important;
} }