Coder Social home page Coder Social logo

cmu-sei / ghosts Goto Github PK

View Code? Open in Web Editor NEW
443.0 19.0 65.0 159.55 MB

GHOSTS is a realistic user simulation framework for cyber simulation, training, and exercise

License: Other

C# 88.46% Batchfile 0.01% Python 2.65% Dockerfile 0.10% PowerShell 0.19% XSLT 0.48% Shell 0.11% PHP 0.94% TypeScript 7.06%
user-simulator simulation simulation-modeling network-simulator network-simulation network-simulations cyber cybersecurity cybertraining behavior

ghosts's Introduction

GHOSTS NPC Framework

GHOSTS simulates what anyone might do at a computer, creating documents, browsing websites, and downloading files. GHOSTS drives all sorts of popular applications on many versions of Windows and Linux machines. Whether you're a friendly administrator or a powerful cyber adversary, GHOSTS can replicate your expected behavior.

GHOSTS has many use cases in cyber training and exercises, most notably for bringing non-player characters (NPCs) to life, but GHOSTS can be used for many other purposes where realistic activity on a computer is needed as well.

There is a short demonstration video available on YouTube (3:03).


Version 8 is here (with breaking changes!). It has absorbed the other modules of the GHOSTS framework, ANIMATOR (now archived) and SPECTRE (now archived). This was done in order to greatly simplify installation, configuration, and the administration of a GHOSTS instance, but also to bring further capability to the core agents by more tightly combining information segregated into separate databases and systems until now.

The breaking changes are:

  1. Configuration file changes
  2. Database changes
  3. API endpoint changes

Sorry, but there is no upgrade path from previous versions — install a fresh instance to get rolling with V8.


Key Links

Platform Components

Ghosts Clients (Windows & Linux)

GHOSTS clients simulate users on a machine doing "user-like" things. They can be configured to:

  • Browse the web
  • Create and edit office documents
  • Send and respond to email
  • Run terminal commands
  • Etc.

Ghosts API Server

The API server provides a way for clients to interact with the GHOSTS system and its clients. It can:

  • Manage clients, add/remove them from groups, etc.
  • Get/manage information from clients regarding their previous or current activities, etc.
  • Orchestrate new activities for particular clients to perform

A resource light version of the Windows GHOSTS client that can be run on minimal hardware.

A server that provides content to GHOSTS clients (or otherwise). Pandora determines what you most likely requested, creates that content, and serves it back in the response. Pandora also has the ability to serve predetermined static content for training and exercise purposes (and red-teaming).

The social media (x.com) server that enables Ghosts clients to post and interact with social media content.

License

[DISTRIBUTION STATEMENT A] This material has been approved for public release and unlimited distribution. Copyright 2017 Carnegie Mellon University. All Rights Reserved. See LICENSE.md file for terms.

ghosts's People

Contributors

23langloisj avatar alexschrichte avatar andrewthigpenbylight avatar avershave avatar dependabot[bot] avatar dustinupdyke avatar harrykhh avatar rbreesems avatar sei-dupdyke avatar simeononsecurity avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ghosts's Issues

Timeline length

Is there a limit to the number of Handlers the timeline.json file can run.
I had 10 and it wouldn't run, I removed 3 and it worked fine.
Great tool btw, thanks in advance.

Unable to add clients on linux

Currently I am attempting to configure GHOSTS, but I am unable to add clients. I am currently doing this on Kali linux. If you have any suggestions please let me know.

Installing API server

I am guessing this is a user error since I am new to Docker and Git.

I am trying to install GHOSTS for a Cyber Security Lab and I am having issues getting it installed from Docker. I have a Debian 10 server setup to run the API server and I have installed Docker. I have downloaded the code and when I run
docker build . -t ghosts/api --no-cache -f dockerfile.api
This is returned:
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /ghosts/GHOSTS-master/Ghosts.Api/dockerfile.api: no such file or directory

When I change to
docker build . -t ghosts/api --no-cache -f dockerfile
This is what I get:
Step 1/8 : FROM microsoft/dotnet:2.2-aspnetcore-runtime-alpine
---> 0e59b34ad3cb
Step 2/8 : COPY bin/publish/. /app/
COPY failed: stat /var/lib/docker/tmp/docker-builder375122196/bin/publish: no such file or directory

I would appreciate any help you can give me.

Working hours 'fuzz'

In the file Ghosts.domain/code/WorkingHours.cs
There is a function for 'fuzzing' the Utc Off and On time of a given process.
There are 2 problems with this fuzzing.
The first and biggest problem line 21-30.
The Utc on an off time are being shifted by up to 30minutes every time a process is run.
It is always shifting the time forward due to a double negative bug.
When the random number is positive it adds to the UTC off time and when there is a negative number it subtracts it causing a double negative hence it also adds more time to the UTC On/Off time.
This results in processes closing hours before they should.

The second problem is when you setup a googlechorme to do a number of things like(browse to a page type in login credentials login click on a couple of things) this function is called every time. That means one browsing session in chrome where you click on 10 things you shift the timeline on average 150minutes.
Even if you fix the first bug it still means an 'unlucky' browsing session in chrome could shift the UTC timeline to cause the process to shutdown for a whole day during one browsing session very quickly.

Skype for Business Handler

This is a bit beyond me, but a Skype for Business handler would be a neat addition. Most likely a lot of DEV time similar to Outlook I imagine.

Docker build doesn't work

Trying to install the API via docker - the dockers don't result in a useable instance. The DOTNET referred to in the dockerfile doesn't appear to be an actually existing instance. How to deploy via docker is poorly documented.

UPDATE: got it to work. If you're reading this and had issues, check you Docker NAT. Mine didn't work with the preconfigured settings.

Enhancement: Browsing by name only

Currently the browser can only find elements by 'name'.
I suggest having options in the timeline for:
typeById
typeByName
ClickById
ClickByName

This way you can select html elements by Ids if the page doesn't have names on specific elements. (You could maintain backwards compatibility by simply adding an option ClickById and leaving Click as the by name default)
Being able to select an element based on a parent and then child of that parent would be nice but harder to implement.

API Examples

Would you have any example API calls that could be included?

Can I tell a machine to open a specific email? Download a file from a website?

Dynamically scale up and down NPC activity

In an exercise it is useful to be able to scale up and scale down activity base on a number of different parameters, a big one being time based. It would also be useful if the NPC didn't restart the timeline each time it was updated and instead the timeline was dynamic so when the timeline was updated the process would dynamically and incrementally update. For example, if an NPC were able to scale up activity on a time scale starting at a certain time, say 0900 when they get into the office until 1200 when they take lunch break where the activity would subsequently drop off and then scale back up at 1300 when they arrive back from lunch and down again at 1600 when they leave the office.

File Permissions in Grafana Container

Following steps from docker-compose install leads to a continuous reboot of the grafana container. A docker logs command on the container led me to a file permission issue within the container with permission denied errors to anything located in /var/lib . I edited the docker-compose.yml file with this line to log in as root instead of the default user on boot:
user: root

Probably not ideal in the long run, but maybe something you want to take a look at.

Installing the Server API via Docker

I am having issues trying to get the Server up and working on Ubuntu 18.04.
Running this command has some errors: $ docker build . -t ghosts/api --no-cache -f dockerfile-api

  1. There is no dockerfile-api file so I used the file found in Ghosts.Api folder called dockerfile
    It would then run but get stuck on step 2/8
  2. It could not copy bin/publish/. /app/ from line 25 of your dockerfile
    I did a interactive terminal into the microsoft/dotnet and could not find bin/publish, but I don't know what you are trying to pull from the microsoft/dotnet docker image

Wiki Installation Guidance

It seems the installation guide (I've only tested the API part so far) might be missing some information or is outdated for the current state of the master branch. Could you update the documentation or provide further guidance for the prerequisites, install, and configuration? Thank you

Credentials for Swagger UI

I'm trying to use the swagger ui, but I can't find the creds to auth. I've tried various combinations of scotty from the other creds that were used.

Where are they configured? What are they?

Thanks!

No email-content and email-reply csv files

The following files are in the gitignore:
ghosts.tools.emailgenerator/config/email-content.csv
ghosts.tools.emailgenerator/config/email-content - Copy.csv
Ghosts.Client/config/email-reply.csv
Ghosts.Client/config/email-content.csv

The code requires these files to compile.
I can add them in myself but obviously I don't know if there is any special format for these files.
Is it just a whole load of comma separated words to be inserted into emails or something else?
Can you please provide information about what should be in the files or a copy of the files you use.

compose-api.yml file

I looked at the files I downloaded and was not able to find the "compose-api.yml".
Attempting to follow the instruction for the Docker-Based Setup.
Would you provide assistance on how to proceed?

Client chrome "type" option issue

I tried to use the "type" option and provide text in the timeline.json file for the ghost client on a windows 10 machine.
I had problems making it work and found that the current version of selenium is incompatible with newer versions of chrome (76) was the one I used.
It was causing an error in this section of code in the BaseBrowser.cs file.

case "type":
    IWebElement e = Driver.FindElement(By.Name(timelineEvent.CommandArgs[0].ToString()));
    e.SendKeys(timelineEvent.CommandArgs[1].ToString());
     //this.Report(timelineEvent);
    break;

Basically the SendKeys function wouldn't work because selenium didn't support the function.

An alternative approach to fix the problem which I also used was to modify the "type" function to work as follows (I couldn't test the code but it was something like this):

case "type":
    IWebElement element = Driver.FindElement(By.Name(timelineEvent.CommandArgs[0].ToString()));
    Actions actions = new Actions(Driver);
    actions.SendKeys(element, timelineEvent.CommandArgs[1].ToString()).Build().Perform();
    break;

Random Reboot

Is there is any way to simulate a reboot randomly or in specific hours ?

Errors with Sample Timelines

Hello,

currently I am testing the project with the sample timelines provided. I ran into multiple errors along the way:

  • In "trackable timeline.json"
2020/05/31 16:04:43.589|Ghosts.Client.Handlers.BaseBrowserHandler.ExecuteEvents|OpenQA.Selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"//a[contains(@class, 'dl')]"}
  (Session info: chrome=81.0.4044.129)
   at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
   at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(String mechanism, String value)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElementByXPath(String xpath)
   at OpenQA.Selenium.By.<>c__DisplayClass19_0.<XPath>b__0(ISearchContext context)
   at OpenQA.Selenium.By.FindElement(ISearchContext context)
   at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by)
   at Ghosts.Client.Handlers.BaseBrowserHandler.ExecuteEvents(TimelineHandler handler) in Z:\Projects\ghosts\Ghosts.Client\Handlers\BaseBrowserHandler.cs:line 136

(Also side question, do we need to ourselves give the guid of the trackable element from the postgres db in the timeline under: "TrackableId": "",)

  • In "BrowserFirefox.json"
2020/05/31 16:36:29.037|Ghosts.Client.Handlers.BaseBrowserHandler.ExecuteEvents|System.ArgumentNullException: Value cannot be null.
Parameter name: source
   at System.Linq.Enumerable.Select[TSource,TResult](IEnumerable`1 source, Func`2 selector)
   at Ghosts.Domain.Code.StringExtensions.ToFormValueString[TKey,TValue](IDictionary`2 dictionary)
   at Ghosts.Client.Handlers.BaseBrowserHandler.MakeRequest(RequestConfiguration config) in Z:\Projects\ghosts\Ghosts.Client\Handlers\BaseBrowserHandler.cs:line 199
   at Ghosts.Client.Handlers.BaseBrowserHandler.ExecuteEvents(TimelineHandler handler) in Z:\Projects\ghosts\Ghosts.Client\Handlers\BaseBrowserHandler.cs:line 69

Running the GHOSTS project on Windows 10 VirtualBox VM
Chrome Version: Version 81.0.4044.129 (Official Build) (64-bit)
Firefox Version: 76.0.1 (64-bit)

Any suggestions?

Client for Windows XP/Server 2k3

Hi! I'm trying to use GHOSTS for a range that is mostly a Windows XP SP3/Server 2k3 environment. I've considered two approaches:

  1. Writing a GHOSTS client from scratch based on the API, or
  2. Downgrading the current client code and rebuilding for .NET Runtime 4.0.3

I guess I was wondering if you had any thoughts on either approach (i.e. are they feasible, would one be more difficult over the other, etc.). I think any documentation you could share on the API would be helpful for approach 1 and if you had a list of dependencies that I would have to rewrite in Runtime 4.0.3. for approach 2 would be very helpful. Thanks in advance!

emails-outside.json

My ghosts instance doesnt seem to be using the "emails-outside.json"

Is anyone able to assist and advise on how this is called upon. I can't work out if it is in application.json or elsewhere.

instalation got stuck - using command docker-compose up -d

Hi ,

i am trying to install by following the instruction on https://github.com/cmu-sei/GHOSTS/wiki/Installation-from-distribution-binaries

I got stuck and got error message :
Starting ghosts-postgres ... error

ERROR: for ghosts-postgres Cannot start service postgres: error while creating mount source path '/Users/dustin/data/ghosts/db_data': mkdir /Users: read-only file system

ERROR: for postgres Cannot start service postgres: error while creating mount source path '/Users/dustin/data/ghosts/db_data': mkdir /Users: read-only file system

I am using Vbox Ubuntu Server 20.4. I have tried to look for the answer in the internet by cannot find it.

Could you help me to solve the problem?

thanks

API largely undocumented: how do I use timeline update

Hi, let me start with the sugar: this is a great project that we have used in our cyber range to great effect.

I know it can do more than we have made it do, but are a little hampered by the state of the API and the lack of any sort of actual interface by which to invoke the methods. Now, I know that I can go to "localhost:5000/swagger" and get the dynamic API documentation and some basic interface to the API. The issue is that it's not completely obvious to me what "right" looks like when I want to do something - most specifically, update a timeline (although I'm interested in what else useful I can do via the API). I know that I can work it out in time...but I was really hoping to save on the PITA factor and put more energy into making my ghosts behaving in the dynamic way I know they can.

Any way you can give an example of what a "proper" timeline update looks like?

Remotely Starting Ghosts

I have some scripts that use psexec to remotely kill ghosts from a domain server, but when trying to start ghosts remotely I have an issue with ChromeDriver.
It errors with:

Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.

I have tried a few methods using psexec as well as Invoke-Command or Enter-PSSession but get the same results or other issues.
eg. psexec \workstation1 C:\Ghosts\ghosts.exe
or Invoke-Command -ComputerName CAN-B1-WS-10 -scriptblock {& 'c:\Ghosts\ghosts.exe}

I am looking at more options to attempt to force a task to run locally, but I thought I would check in to see if you had any ideas. I think there is a while to have chromedriver --whitlisted-ips="" but I think I would need to compile it that way?

GHOSTS API not differentiating between multiple VMs originating from the same *.ova image

Hello,

i have been experimenting with the GHOSTS framework for some time now and I wanted to do a big scale test of it by connecting multiple Windows Clients to the GHOSTS server. I have a Windows10 *.ova image that i used to instantiate 5 VMs in VirtualBox, with each VM having a different IP and computer name.

I connected each Windows Client to the GHOSTS Server Api via the application.json file and they all work, but with one major flaw: the 5 VMs are all considered as one and the same by the Server API and viewing the output in Grafana I only see 1 NPC active (the first machine that connected to the API). Looking into the postgresql db I also see only one table entry in the "machines" table, even when 5 VMs are running.

I would like to know if this is normal behavior. How does the GHOSTS Api differentiate between different Clients (does it look at the Windows Device ID for example?) and is there a way to have 5 VM clones run as clients and still be considered different clients by the GHOSTS server.

Thank you

Open a file from network share and edit

I am using the following timeline to open a file, is this the best way to do it?
Also is there a way to then add contect to the file like the create function does?

{
    "Status": "Run",
    "TimeLineHandlers": [
        {
            "HandlerType": "Command",
            "Initial": "",
            "UtcTimeOn": "00:00:00",
            "UtcTimeOff": "24:00:00",
            "Loop": "False",
            "TimeLineEvents": [
                {
                    "Command": "explorer %homedrive%%homepath%\\Documents\\abacus.xlsx",
                    "CommandArgs": ["exit"],
                    "DelayAfter": 1000,
                    "DelayBefore": 0
                }
            ]
        }
    ]
}

Network share based email content

It would be useful if within the Gh0sts client I were able to configure a network share location for email content to be used within the client application. So instead of a specific file in a specific location in relation to the install path I would like to be able to specify a path where the email content would reside.

Scaling Timeline

In an exercise it is useful to be able to scale up and scale down activity base on a number of different parameters, a big one being time based. It would also be useful if the NPC didn't restart the timeline each time it was updated and instead the timeline was dynamic so when the timeline was updated the process would dynamically and incrementally update. For example, if an NPC were able to scale up activity on a time scale starting at a certain time, say 0900 when they get into the office until 1200 when they take lunch break where the activity would subsequently drop off and then scale back up at 1300 when they arrive back from lunch and down again at 1600 when they leave the office.

Win10 client doesnt connect to Server API

Hi everyone, hope the question is appropriate:

I have been trying for weeks to connect my Win10 client to server API, which is on Kali (which is on VMWare). Server is running up on :5000, i can access it in browser, Grafana is also running up on :3000, and I have createad postgre database and imported .json default dashboard. Also, ghosts is running on Win10 perfectly.

The problem occurs when I try to connect client to server through application.json file (which is mentioned in documentation). I tried forwarding the server url in IdUrl variable, but it doesn't work. I also tried switching to bridged mode, and then forwarding the IP address/api/clientId, but it also doesn't work. I think I tried everything I could.

Does anyone know how to connect them? Many thanks in advance!

Docker setup

I would like to use this for a project I'm starting but I seem to be having an issue with the initial docker setup. I'm trying to run the API on Ubuntu and this is the following output I get.

cyber@ubuntu:~/Desktop/GHOSTS-master/Ghosts.Api$ sudo docker build . -t ghost/api --no-cache -f dockerfile
Sending build context to Docker daemon 206.3kB
Step 1/8 : FROM microsoft/dotnet:2.2-aspnetcore-runtime-alpine
---> 0e59b34ad3cb
Step 2/8 : COPY bin/publish/. /app/
COPY failed: stat /var/lib/docker/tmp/docker-builder122496556/bin/publish: no such file or directory

Chrome Binary Not Found Error

The default code base lacks the path to the Chrome executable. Original error message:

2020/11/25 18:09:48.256|Ghosts.Client.Handlers.BrowserChrome..ctor|OpenQA.Selenium.WebDriverException: unknown error: cannot find Chrome binary
at OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)
at OpenQA.Selenium.Remote.RemoteWebDriver.StartSession(ICapabilities desiredCapabilities)
at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities)
at OpenQA.Selenium.Chrome.ChromeDriver..ctor(ChromeDriverService service, ChromeOptions options, TimeSpan commandTimeout)
at OpenQA.Selenium.Chrome.ChromeDriver..ctor(ChromeOptions options)
at Ghosts.Client.Handlers.BrowserChrome..ctor(TimelineHandler handler) in Z:\Projects\ghosts\src\Ghosts.Client\Handlers\BrowserChrome.cs:line 63

Manually adding the below line to BrowserChrome.cs appears to resolve the issue

options.BinaryLocation = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";

64 bit Office Version Requires 64 bit version of GHOSTS

I ran an instance of GHOSTS on a 64 Bit Windows 10 VM with Office 2016 x64 installed. Redemption was present and I even updated to the current release (20 Nov 2020); but still received the following error message:

2020/11/25 18:09:52.824|Ghosts.Client.Handlers.Outlook..ctor|RDO load error: System.Runtime.InteropServices.COMException (0x800401FA): Wrong OS or OS version for application (Exception from HRESULT: 0x800401FA (CO_E_WRONGOSFORAPP))
at Ghosts.Client.Infrastructure.Email.RedemptionLoader.IClassFactory.CreateInstance(Object pUnkOuter, Guid& refiid, Object& ppunk)
at Ghosts.Client.Infrastructure.Email.RedemptionLoader.NewRedemptionObject(Guid guid) in Z:\Projects\ghosts\src\Ghosts.Client\Infrastructure\Email\RedemptionLoader.cs:line 256
at Ghosts.Client.Infrastructure.Email.RedemptionLoader.new_RDOSession() in Z:\Projects\ghosts\src\Ghosts.Client\Infrastructure\Email\RedemptionLoader.cs:line 27
at Ghosts.Client.Handlers.Outlook..ctor(TimelineHandler handler) in Z:\Projects\ghosts\src\Ghosts.Client\Handlers\Outlook.cs:line 44
2020/11/25 18:09:53.595|Ghosts.Client.Handlers.Outlook.SendEmailViaOutlook|System.Runtime.InteropServices.COMException (0x800401FA): Creating an instance of the COM component with CLSID {741BEEFD-AEC0-4AFF-84AF-4F61D15F5526} from the IClassFactory failed due to the following error: 800401fa Wrong OS or OS version for application (Exception from HRESULT: 0x800401FA (CO_E_WRONGOSFORAPP)).
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.Activator.CreateInstance(Type type)
at Ghosts.Client.Handlers.Outlook.SendEmailViaOutlook(EmailConfiguration emailConfig) in Z:\Projects\ghosts\src\Ghosts.Client\Handlers\Outlook.cs:line 381

The current deafult project build settings had a "Platform Target" of "Any" with "Prefer 32-bit" checked.

Fix action per http://www.dimastr.com/redemption/faq.htm#ErrorCreatingRedemptionObject is to compile and a x64 version of GHOSTS using Visual Studio for instances where 64 bit Outlook is being used. I was able to confirm this change corrected the Outlook issue.

Compiling issues with Redemption

Hi, I am trying to compile the Windows client with visual studio 2019, but I received several errors related to RedemptionLoader.cs and outlook.cs.

I installed the Developer version from dimastr.com

errors.xlsx

Thanks.

John

Use of CommandArgs

I am trying to use the click command after the Browser command.
Is there any documentation on what CommandArgs can be used to click on links within a website.
I note "click: Once you have browsed to a page, use this to click a link by it's name (supplied as CommandArgs[0])."
What is considered to be "by its name"?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.